{"id":1835,"date":"2019-12-05T12:43:01","date_gmt":"2019-12-05T03:43:01","guid":{"rendered":"https:\/\/www.oji-koji.com\/?p=1835"},"modified":"2021-07-28T10:45:27","modified_gmt":"2021-07-28T01:45:27","slug":"%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e9%80%81%e5%8f%97%e4%bf%a1%e6%a9%9f%e8%83%bd%e3%81%ae%e5%ae%9f%e8%a3%85%e3%82%b5%e3%83%bc%e3%83%90%e5%81%b4%e3%81%ae%e5%8f%97%e4%bf%a1%e6%a9%9f%e8%83%bd%e3%81%ae","status":"publish","type":"post","link":"https:\/\/www.oji-koji.com\/?p=1835","title":{"rendered":"\u30d5\u30a1\u30a4\u30eb\u9001\u53d7\u4fe1\u6a5f\u80fd\u306e\u5b9f\u88c5(\u30b5\u30fc\u30d0\u5074\u306e\u53d7\u4fe1\u6a5f\u80fd\u306e\u5b9f\u88c5)2019\/12\/08\u66f4\u65b0"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p class=\"program_discription\">\u4eca\u56de\u306f\u53d7\u4fe1\u5074(\u30b5\u30fc\u30d0)\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u8003\u3048\u3066\u307f\u307e\u3057\u3087\u3046\u3002<br>CSendRecvThraed\u306e\u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u683c\u7d0d\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u3092<br>CRecvFileThread\u306e\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u7528\u306e\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u683c\u7d0d\u3057\u307e\u3059\u3002<br>CRecvFileThread\u306f\u3053\u306e\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u683c\u7d0d\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u306b<br>\u5f93\u3063\u3066\u51e6\u7406\u3092\u884c\u3044\u307e\u3059\u3002<br>\u4eca\u56de\u306f\u7c21\u5358\u306e\u305f\u3081\u306b\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u51e6\u7406\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\u6642\u306f\u3001CRecvFileThread\u3092<br>\u7d42\u4e86\u3001CSendRecvThraed\u3082\u7d42\u4e86\u3057\u3066\u5f53\u8a72\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068\u306e\u63a5\u7d9a\u3092\u7d42\u4e86(\u5207\u65ad)\u3059\u308b<br>\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecv3-1024x419.png\" alt=\"\" class=\"wp-image-1838\" width=\"768\" height=\"314\" srcset=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecv3-1024x419.png 1024w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecv3-300x123.png 300w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecv3-768x314.png 768w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecv3.png 1180w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption>\u53d7\u4fe1\u5074\u306eCSendRecvThread\u306e<strong>m_pCRingBuffRecv<\/strong>\u306b\u683c\u7d0d\u3055\u308c\u305f<br>\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u3092CRecvThread\u306e<strong>m_pCRingBuffCmd<\/strong>\u306b\u683c\u7d0d\u3059\u308b\u3002<br> CRecvThread\u306fm_pCRingBuffCmd\u306b\u683c\u7d0d\u3055\u308c\u305f\u30b3\u30de\u30f3\u30c9\u306b\u5f93\u3063\u3066<br>\u30d5\u30a1\u30a4\u30eb\u66f8\u304d\u8fbc\u307f\u3092\u5b9f\u884c\u3059\u308b\u3002<\/figcaption><\/figure>\n\n\n\n<p class=\"program_discription\">\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u3092\u5b9f\u73fe\u3059\u308b\u30af\u30e9\u30b9CRecvFileThread\u306e\u4f5c\u6210<br>\u6b21\u306e\u3088\u3046\u306a\u6a5f\u80fd\u3092\u8003\u3048\u307e\u3059\u3002<br>CSendRecvThread\u3067\u3044\u3064\u3067\u3082\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u304c\u3067\u304d\u308b\u3088\u3046\u306bCSendRecvThread\u69cb\u7bc9\u6642\u306b<br>CRecvFileThread\u3092\u69cb\u7bc9\u3057\u307e\u3059\u3002<br>\u7834\u68c4\u306b\u3064\u3044\u3066\u306f\u3001CSendRecvThread\u304c\u7834\u68c4\u6642\u3055\u308c\u308b\u3068\u304d\u306b\u7834\u68c4\u3057\u307e\u3059\u3002<br>AnalyzeCmd()\u3067m_pCRingBuffCmd\u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u30b3\u30de\u30f3\u30c9\u3092\u89e3\u6790\u3057\u4ee5\u4e0b\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<br>(\uff0a)\u30b3\u30de\u30f3\u30c9\u304c\u5b9f\u884c\u72b6\u614b(\u9077\u79fb\u72b6\u614b)\u3068\u4e00\u81f4\u3057\u306a\u3044\u3068\u304d\u306f\u30a8\u30e9\u30fc\u3068\u3057\u3066\u5207\u65ad\u3057\u307e\u3059\u3002<br>\u3000\u30a8\u30e9\u30fc\u767a\u751f\u6642\u3001CRecvFileThread\u3092\u30be\u30f3\u30d3\u72b6\u614b\u306b\u3057\u3066\u3001CSendRecvThread\u3067\u7834\u68c4\u3057<br>\u3000CSendRecvThread\u3092\u30be\u30f3\u30d3\u72b6\u614b\u306b\u3059\u308b\u3068\u3001\u5f53\u8a72\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u5207\u65ad\u3055\u308c\u307e\u3059\u3002<br>\u3000\u5207\u65ad\u305b\u305a\u306b\u30a8\u30e9\u30fc\u3092\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u9001\u4fe1\u3057\u65b0\u305f\u306a\u30d5\u30a1\u30a4\u30eb\u3092\u9001\u4fe1\u3059\u308b\u3088\u3046\u306b\u3082\u3067\u304d\u307e\u3059\u304c\u3001<br> \u3000\u7c21\u5358\u306e\u305f\u3081\u306b\u4eca\u56de\u306f\u5207\u65ad\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002<br><strong>\u2460\u6307\u5b9a\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u30aa\u30fc\u30d7\u30f3\u3057\u307e\u3059\u3002<\/strong><br>\u3000RecvSendFileStartPacket(SendFileStartReqRec *pbPacket)<br>(\uff0a)\u7d50\u679c\u3092\u9001\u4fe1\u3059\u308b    <br><strong>\u2461\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304d\u8fbc\u307f\u307e\u3059<\/strong>\u3002<br>\u3000 RecvSendFileIngPacket(SendFileIngRec *pbPacket)<br>\u2461\u3092\u7e70\u308a\u8fd4\u3057\u307e\u3059\u3002<br><strong>\u2462\u30d5\u30a1\u30a4\u30eb\u3092\u30af\u30ed\u30fc\u30ba\u3057\u307e\u3059\u3002<\/strong><br>\u3000RecvSendFileEndPacket(SendFileEndReqRec *pbPacket)<br>(\uff0a)\u7d50\u679c\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<br>\u2462\u307e\u3067\u3001\u6b63\u5e38\u306b\u5b8c\u4e86\u3059\u308c\u3070\u3001\u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u53d7\u4fe1\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br>(\uff0a)\u306b\u3064\u3044\u3066\u306f\u3001\u5f8c\u7a0b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8(<a href=\"https:\/\/www.oji-koji.com\/pro-files\/SimpleServerTransFileRingSpeed1Linux.zip\">SimpleServerTransFile<\/a>)\u306b\u6b21\u306e\u5909\u66f4\u3092\u884c\u3044\u307e\u3059\u3002<br>\u4eca\u56de\u306e\u4ed5\u69d8\u3067\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u7f6e\u304d\u5834\u6240\u3092\u30ab\u30ec\u30f3\u30c8\u30d5\u30a9\u30eb\u30c0\u306b\u3059\u308b\u306e\u3067<br>\u30c7\u30d0\u30c3\u30b0\u6642\u3082\u5b9f\u884c\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308b\u5834\u6240\u3092\u30ab\u30ec\u30f3\u30c8\u30d5\u30a9\u30eb\u30c0\u3068\u3059\u308b\u3088\u3046\u306b<br>\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u5909\u66f4\u3092\u884c\u3044\u307e\u3059\u3002<br>\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u5909\u66f4<br>\u3000\/home\/pi\/projects\/$(ProjectName)\/\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">Windows\u3068\u306e\u4e92\u63db\u6027\u3092\u56f3\u308b\u305f\u3081\u306bSimplServer.cpp\u306b\u8a18\u8ff0\u3057\u3066\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092<br>stdThread.h\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">#ifndef _stdThread_H_2B9D23FC_90BF_4898_B161_B894F01F6698\n#define _stdThread_H_2B9D23FC_90BF_4898_B161_B894F01F6698\n\n#include    &lt;stdio.h&gt;\n#include    &lt;stdlib.h&gt;\n#include    &lt;pthread.h&gt;\n#include    &lt;unistd.h&gt;\n#include    &lt;string.h&gt;\n#include    &lt;sys\/time.h&gt;\n#include    &lt;sys\/select.h&gt;\n#include    &lt;netdb.h&gt;\n#include    &lt;sys\/socket.h&gt;\n#include    &lt;netinet\/in.h&gt;\n#include    &lt;arpa\/inet.h&gt;\n#include    &lt;errno.h&gt;\n#include    &lt;netinet\/tcp.h&gt; \n#include    &lt;sys\/stat.h&gt;\n#include    &lt;sys\/types.h&gt;\n#include    &lt;fcntl.h&gt;\n#include    &lt;limits.h&gt;\n#include    &lt;termios.h&gt;\n#include    &lt;poll.h&gt;\n\n#define     SOCKET_ERROR    (-1)\n#define     INVALID_SOCKET  (-1)\n#define     TRUE            (1)\n#define     FALSE           (0)\n\ntypedef unsigned char       BYTE;\ntypedef int                 BOOL;\ntypedef unsigned int        UINT;\ntypedef unsigned short       WORD;\n\/\/ Linux  :LP64  long:64 int:32\n\/\/ Windows:LLP64 long:32 int:32    pointer\u306e\u307f\u304c64bits\u306b\u306a\u3063\u3066\u3044\u308b\n\/\/typedef unsigned long     DWORD;            \/\/ Windows\ntypedef unsigned int        DWORD;            \/\/ Linux\ntypedef BYTE                *LPBYTE;\ntypedef char                *LPSTR;\ntypedef const char          *LPCSTR;\ntypedef char                *LPTSTR;\ntypedef const char          *LPCTSTR;\ntypedef signed long long    SInt64;\ntypedef unsigned long long  UInt64;\n\ntypedef int                 SOCKET;\n\n\/\/=======================================================================\n#define min(a,b)            (((a) &lt; (b)) ? (a) : (b))\n#define max(a,b)            (((a) &gt; (b)) ? (a) : (b))\n\n#define SAFE_FREE(p)    { if(p) { free(p); (p)=NULL; } }\n#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }\n#define SAFE_DELETE_ARRAY(p)  { if(p) { delete[] (p); (p)=NULL; } }\n\/\/=======================================================================\n\/\/ \u2605\n#ifdef _MSC_VER         \/\/ Windows\u306e\u3068\u304d\n#define DISABLE_C4996   __pragma(warning(push)) __pragma(warning(disable:4996))\n#define ENABLE_C4996    __pragma(warning(pop))\n#else                   \/\/ Linux\u306e\u3068\u304d\n#define DISABLE_C4996\n#define ENABLE_C4996\n#endif\n\nextern DWORD GetdwInterval(DWORD dwNow, DWORD dwPast);\nextern DWORD timeGetTime();\nextern int kbhit(void);\nextern int DispErrorMsg(LPCSTR pszTitle);\nextern void Locate(int iCol, int iRow, int iErase);\n#endif<\/p>\n\n\n\n<p class=\"program_discription\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u30af\u30e9\u30b9CRecvThread(RecvFileThread.h, RecvFileThread.cpp)\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br>\u57fa\u5e95\u30af\u30e9\u30b9\u306fCThreadJob\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">RecvFileThread.h\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<br>\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u306f\u9001\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9(\u89aa\u30b9\u30ec\u30c3\u30c9)\u3092\u6e21\u3057\u307e\u3059\u3002<br>\u2460\u6307\u5b9a\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u30aa\u30fc\u30d7\u30f3\u3059\u308b\u3001\u2461\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304d\u8fbc\u3080\u3001\u2462\u30d5\u30a1\u30a4\u30eb\u3092\u30af\u30ed\u30fc\u30ba\u3059\u308b<br>\u3092\u5b9f\u73fe\u3059\u308b\u30e1\u30bd\u30c3\u30c9\u3092\u5b9a\u7fa9\u3057\u3066\u3044\u307e\u3059\u3002<br>\u307e\u305f\u30a8\u30e9\u30fc\u6642\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3059\u308b\u305f\u3081\u306b\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u8a18\u61b6\u3059\u308b\u5909\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010RecvFileThread.h\u3011\n#pragma once\n#include &#8220;ThreadJob.h&#8221;\n#include &#8220;define.h&#8221;                     \/\/ \u30d1\u30b1\u30c3\u30c8\u4f5c\u6210\u306e\u305f\u3081\n\n#define    CMD_BUFF_SIZE    (1024 * 64) \/\/ \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u683c\u7d0d\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u30b5\u30a4\u30ba\n\/\/ \u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u9077\u79fb\u72b6\u614b\n#define RECVC_FILE_STAT_IDLE    0       \/\/ \u521d\u671f\u72b6\u614b\n#define RECVC_FILE_STAT_ING     1       \/\/ \u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u4e2d\n\nclass CMySyncObject;                    \/\/ CMySyncObject\u3092\u4f7f\u3046\u305f\u3081\nclass CSendRecvThread;                  \/\/ CSendRecvThread\u3092\u4f7f\u3046\u305f\u3081\nclass CRingBuff;                        \/\/ CRingBuff\u3092\u4f7f\u3046\u305f\u3081\n\nclass CRecvFileThread :\n    public CThreadJob\n{\npublic:\n    CRecvFileThread(CSendRecvThread *pCSendRecvThread);\n    ~CRecvFileThread();\n\n    CRingBuff    *m_pCRingBuffCmd;      \/\/ \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u683c\u7d0d\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\n\n    UINT DoWork() override;\n    BOOL IsZombie();                    \/\/ \u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306f\u30be\u30f3\u30d3\u72b6\u614b\u304b\n\nprivate:\n    CSendRecvThread *m_pCSendRecvThread;\n    int             m_fdDstFile;        \/\/ \u53d7\u4fe1\u30d5\u30a1\u30a4\u30eb\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\n    CMySyncObject   *m_pCMySyncObject;\n    BOOL            m_fIamZombie;       \/\/ \u30be\u30f3\u30d3\u72b6\u614b\u304b\n    int             m_iRecvFileStatus;  \/\/ \u9077\u79fb\u72b6\u614b RECVC_FILE_STAT_IDLE\/RECVC_FILE_STAT_ING\n    \/\/ \u30d5\u30a1\u30a4\u30eb\u540d\u6587\u5b57\u5217(null\u30bf\u30fc\u30df\u30cd\u30fc\u30c8\u3092\u542b\u3080)UTF-8 \u30a8\u30e9\u30fc\u6642\u30d5\u30a1\u30a4\u30eb\u524a\u9664\u7528\n    char            m_szFileName[FILE_NAME_LEN + 1];    \n\n    int AnalyzeCmd();\n    int RecvSendFileStartPacket(SendFileStartReqRec *pbPacket); \/\/ \u2460\u6307\u5b9a\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u30aa\u30fc\u30d7\u30f3\u3059\u308b\n    int RecvSendFileIngPacket(SendFileIngRec *pbPacket);        \/\/ \u2461\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304d\u8fbc\u3080\n    int RecvSendFileEndPacket(SendFileEndReqRec *pbPacket);     \/\/ \u2462\u30d5\u30a1\u30a4\u30eb\u3092\u30af\u30ed\u30fc\u30ba\u3059\u308b\n};<\/p>\n\n\n\n<p class=\"program_discription\">RecvFileThread.cpp\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<br>\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304d\u8fbc\u307f\u30e2\u30fc\u30c9\u3067\u30aa\u30fc\u30d7\u30f3\u3057\u307e\u3059\u304c\u3001\u3059\u3067\u306b\u5b58\u5728\u3057\u3066\u3044\u308b\u30d5\u30a1\u30a4\u30eb\u306f<br>\u9577\u3055\u30920\u306b\u3057\u3066\u3057\u307e\u3046\u3053\u3068\u306b\u3057\u307e\u3059\u3002(\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3001\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u304c\u6210\u529f\u3057\u305f\u3089<br>\u540d\u524d\u3092\u5909\u66f4\u3059\u308b\u65b9\u304c\u826f\u3044\u306e\u3067\u3059\u304c\u3001\u3053\u3053\u3067\u306f\u7c21\u5358\u306e\u305f\u3081\u306b\u540c\u540d\u30d5\u30a1\u30a4\u30eb\u306f\u4e0a\u66f8\u304d\u3059\u308b<br>\u3053\u3068\u306b\u3057\u3066\u3044\u307e\u3059\uff09<br>\u3000m_fdDstFile = open(pbPacket-&gt;FileInfo.szFileName,<br>\u3000\u3000O_CREAT | O_WRONLY | <strong>O_TRUNC<\/strong>, <strong>S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |<\/strong><br>\u3000\u3000<strong>S_IROTH | S_IWOTH<\/strong>);<br>\u3000\u306e\u3088\u3046\u306bLinux\u3067\u306f\u30e2\u30fc\u30c9\u3082\u6307\u5b9a\u3057\u307e\u3059\u3002<br>\u3000\u5f15\u6570\u306e\u8a73\u7d30\u306f\u6b21\u306e\u30b5\u30a4\u30c8\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br>\u3000<a href=\"https:\/\/linuxjm.osdn.jp\/html\/LDP_man-pages\/man2\/open.2.html\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Linux Programmer's Manual (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\">Linux Programmer&#8217;s Manual<\/a><\/p>\n\n\n\n<p class=\"source_code\">\u3010RecvFileThread.cpp\u3011\n#include &#8220;RecvFileThread.h&#8221;\n#include &#8220;MySyncObject.h&#8221;\n#include &#8220;SendRecvThread.h&#8221;\n#include &#8220;RingBuff.h&#8221;\n\nCRecvFileThread::CRecvFileThread(CSendRecvThread *pCSendRecvThread)\n{\n    \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u8a18\u61b6\u3059\u308b\n    m_pCSendRecvThread = pCSendRecvThread;\n\n    \/\/ \u5909\u6570\u306e\u521d\u671f\u5316\n    m_fIamZombie = FALSE;\n    m_fdDstFile = -1;                               \/\/ \u30d5\u30a1\u30a4\u30eb\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\n    m_iRecvFileStatus = RECVC_FILE_STAT_IDLE;       \/\/ \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u51e6\u7406\u306e\u9077\u79fb\n    memset(m_szFileName, 0, sizeof(m_szFileName));  \/\/ \u30d5\u30a1\u30a4\u30eb\u524a\u9664\u306e\u305f\u3081\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u306e\u521d\u671f\u5316\n\n    m_pCRingBuffCmd = new CRingBuff(CMD_BUFF_SIZE); \/\/ \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u683c\u7d0d\u7528\n    m_pCMySyncObject = new CMySyncObject();\n    m_pCMySyncObject-&gt;Initialize();\n}\n\n\nCRecvFileThread::~CRecvFileThread()\n{\n    if (m_pCMySyncObject != NULL)\n        m_pCMySyncObject-&gt;Uninitialize();\n    SAFE_DELETE(m_pCMySyncObject)\n    SAFE_DELETE(m_pCRingBuffCmd)\n\/\/ \u30aa\u30fc\u30d7\u30f3\u3057\u305f\u307e\u307e\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308c\u3070\u304a\u304b\u3057\u3044\u306e\u3067\u30af\u30ed\u30fc\u30ba\u3001\u524a\u9664\n    if (m_fdDstFile != -1)\n    {\n        close(m_fdDstFile);\n        unlink(m_szFileName);\n    }\n    m_fdDstFile = -1;\n}\n\nUINT CRecvFileThread::DoWork()\n{\n    BOOL        fRet = TRUE;\n\n    while (!m_fStopFlag)\n    {\n        usleep(10 * 1000);          \/\/ usleep\u3092\u5165\u308c\u3066\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u30c1\u30e3\u30f3\u30b9\u3092\u4e0e\u3048\u308b\n        if (AnalyzeCmd() == -1)     \/\/ \u8fd4\u5024\u304c-1\u306e\u6642\u304c\u30a8\u30e9\u30fc\u3001\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u3092\u30be\u30f3\u30d3\u306b\u3059\u308b\n        {\n            fRet = FALSE;\n            break;\n        }\n    }\n    m_pCMySyncObject-&gt;Lock();\n    m_fIamZombie = TRUE;\n    m_pCMySyncObject-&gt;UnLock();\n    return((fRet == TRUE) ? 0 : -1);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u306e\u89e3\u6790\n\/\/ parameter\n\/\/      \u306a\u3057\n\/\/ retun\n\/\/      0:\u5341\u5206\u306a\u30c7\u30fc\u30bf\u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u306a\u3044\u306a\u3069 1:\u89e3\u6790\u6210\u529f -1:\u89e3\u6790\u5931\u6557\n\/\/==============================================\nint CRecvFileThread::AnalyzeCmd()\n{\n    int         iRet = 0;\n    HeaderRec   Header;\n    WORD        wCmd;\n    int         iSize = m_pCRingBuffCmd-&gt;GetReadableSize();\n    int         iPacketSize, iDataSize;\n    LPBYTE      pbPacket = NULL;\n\n    if (iSize &lt; sizeof(HeaderRec))       \/\/ \u30d8\u30c3\u30c0\u30b5\u30a4\u30ba\u306b\u6e80\u305f\u306a\u3044\u3068\u304d\u306f\u4f55\u3082\u3057\u306a\u3044\n        goto L_END;\n\n    \/\/ \u30d8\u30c3\u30c0\u90e8\u3092\u501f\u308a\u8aad\u307f\u8fbc\u307f\u3059\u308b(\u30d1\u30b1\u30c3\u30c8\u4e38\u3054\u3068\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u306f\u305a\u3067\u3059\u304c)\n    m_pCRingBuffCmd-&gt;ReadWithoutUpdateHeadPoint((LPBYTE)&amp;Header, sizeof(HeaderRec));\n    wCmd = ntohs(Header.wCommand);\n    iDataSize = ntohs(Header.wDataLen);\n    iPacketSize = iDataSize + sizeof(HeaderRec);\n    if (iSize &lt; iPacketSize)             \/\/ \u30d1\u30b1\u30c3\u30c8\u30b5\u30a4\u30ba\u306b\u6e80\u305f\u306a\u3044\u3068\u304d\u306f\u4f55\u3082\u3057\u306a\u3044\n        goto L_END;\n\n    pbPacket = (LPBYTE)calloc(iPacketSize, sizeof(BYTE));\n    \/\/ \u30d1\u30b1\u30c3\u30c8\u5168\u4f53\u3092\u8aad\u3080\n    m_pCRingBuffCmd-&gt;Read(pbPacket, iPacketSize);\n\n    switch (wCmd)\n    {\n        case CMD_SEND_FILE_START_REQ:       \/\/ \u2460\u9001\u4fe1\u958b\u59cb\u8981\u6c42\u53d7\u4fe1\n            iRet = RecvSendFileStartPacket((SendFileStartReqRec *)pbPacket);\n            break;\n        case CMD_SEND_FILE_ING:             \/\/ \u2461\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u4e2d\n            iRet = RecvSendFileIngPacket((SendFileIngRec *)pbPacket);\n            break;\n        case CMD_SEND_FILE_END_REQ:         \/\/ \u2462\u9001\u4fe1\u5b8c\u4e86\u8981\u6c42\u53d7\u4fe1\n            iRet = RecvSendFileEndPacket((SendFileEndReqRec *)pbPacket);\n            break;\n        \/\/ \u2605CMD_SEND_FILE_ABORT_REQ\u3082\u5f8c\u307b\u3069\u51e6\u7406\u3059\u308b\u3088\u3046\u306b\u3057\u307e\u3057\u3087\u3046\n        default:\n            iRet = -1;                      \/\/ \u77e5\u3089\u306a\u3044\u30b3\u30de\u30f3\u30c9\n            break;\n    }\nL_END:\n    SAFE_FREE(pbPacket)\n    return(iRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u2460\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u958b\u59cb\u30b3\u30de\u30f3\u30c9\u306e\u53d7\u4fe1\n\/\/ parameter\n\/\/      SendFileStartReqRec *pbPacket    [in]\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u958b\u59cb\u30b3\u30de\u30f3\u30c9\u30d1\u30b1\u30c3\u30c8\n\/\/ retun\n\/\/      1:\u89e3\u6790\u6210\u529f -1:\u81f4\u547d\u7684\u30a8\u30e9\u30fc\n\/\/==============================================\nint CRecvFileThread::RecvSendFileStartPacket(SendFileStartReqRec *pbPacket)\n{\n    int     iRet = 0;\n\n    Locate(1, 11, 2);\n    fprintf(stderr, &#8220;Start %s %s(%u)&#8221;, pbPacket-&gt;FileInfo.szFileName, pbPacket-&gt;FileInfo.szFileSize, timeGetTime());\n\n    if (m_iRecvFileStatus != RECVC_FILE_STAT_IDLE)\n    {\n        iRet = -1;              \/\/ \u9077\u79fb\u72b6\u614b\u30a8\u30e9\u30fc\u306f\u5207\u65ad\u3059\u308b\n        goto L_END;\n    }\n    \/\/ \u3053\u3053\u3067\u66f8\u304d\u8fbc\u307f\u7528\u306b\u30d5\u30a1\u30a4\u30eb\u3092open\u3059\u308b\n    if ((m_fdDstFile = open(pbPacket-&gt;FileInfo.szFileName,\n        O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)) == -1)\n    {\n        \/\/ \u2605\u5f8c\u7a0b\u30d5\u30a1\u30a4\u30eb\u304c\u4f5c\u308c\u306a\u3044\u30a8\u30e9\u30fc\u3092\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u8fd4\u3059\u3088\u3046\u306b\u3057\u307e\u3059\n        goto L_END;\n    }\n    \/\/ \u958b\u59cb\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u899a\u3048\u308b\n    strcpy(m_szFileName, pbPacket-&gt;FileInfo.szFileName);\n    m_iRecvFileStatus = RECVC_FILE_STAT_ING;\n    \/\/ \u2605\u5f8c\u7a0b\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u958b\u59cb\u8981\u6c42\u6210\u529f\u3092\u8fd4\u3059\u3088\u3046\u306b\u3057\u307e\u3059\n    iRet = 1;\nL_END:\n    if (iRet == -1)             \/\/ \u30a8\u30e9\u30fc\u6642\u30aa\u30fc\u30d7\u30f3\u3057\u3066\u3044\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308c\u3070\u30af\u30ed\u30fc\u30ba\u3001\u524a\u9664\n    {\n        if (m_fdDstFile != -1)\n        {\n            close(m_fdDstFile);\n            unlink(m_szFileName);\n        }\n        m_fdDstFile = -1;\n    }\n    return(iRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/        \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u4e2d\u30b3\u30de\u30f3\u30c9\u306e\u53d7\u4fe1\n\/\/ parameter\n\/\/         SendFileIngRec *pbPacket[in]\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u4e2d\u30b3\u30de\u30f3\u30c9\u30d1\u30b1\u30c3\u30c8\n\/\/ return\n\/\/        0:\u5341\u5206\u306a\u30c7\u30fc\u30bf\u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u306a\u3044 1:\u89e3\u6790\u6210\u529f -1:\u89e3\u6790\u5931\u6557\n\/\/==============================================\nint CRecvFileThread::RecvSendFileIngPacket(SendFileIngRec *pbPacket)\n{\n    int         iRet = 0;\n    long        lDataSize, lOffset;\n\n    Locate(1, 12, 1);\n    fprintf(stderr, &#8220;Ing %s %s&#8221;, pbPacket-&gt;Stat.szOffset, pbPacket-&gt;Stat.szSize);\n\n    if (m_iRecvFileStatus != RECVC_FILE_STAT_ING)\n    {\n        iRet = -1;              \/\/ \u9077\u79fb\u72b6\u614b\u30a8\u30e9\u30fc\u306f\u5207\u65ad\u3059\u308b\n        goto L_END;\n    }\n    lDataSize = atol(pbPacket-&gt;Stat.szSize);\n    lOffset = atol(pbPacket-&gt;Stat.szOffset);\n    if (lDataSize &gt; 0)\n    {\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u5931\u6557\u6642\u30a8\u30e9\u30fc\u3068\u3057\u3066\u5207\u65ad\n        if (lseek(m_fdDstFile, lOffset, SEEK_SET) == -1)\n        {\n            iRet = -1;\n            goto L_END;\n        }\n        if (write(m_fdDstFile, pbPacket-&gt;bData, lDataSize) != lDataSize)\n        {\n            iRet = -1;\n            goto L_END;\n        }\n    }\n    iRet = 1;\nL_END:\n    if (iRet == -1)             \/\/ \u30a8\u30e9\u30fc\u6642\u30aa\u30fc\u30d7\u30f3\u3057\u3066\u3044\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308c\u3070\u30af\u30ed\u30fc\u30ba\u3001\u524a\u9664\n    {\n        if (m_fdDstFile != -1)\n        {\n            close(m_fdDstFile);\n            unlink(m_szFileName);\n        }\n        m_fdDstFile = -1;\n    }\n    return(iRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/        \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u7d42\u4e86\u30b3\u30de\u30f3\u30c9\u306e\u53d7\u4fe1\n\/\/ parameter\n\/\/         SendFileEndReqRec *pbPacket     [in]\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u7d42\u4e86\u30b3\u30de\u30f3\u30c9\u30d1\u30b1\u30c3\u30c8\n\/\/ return\n\/\/        0:\u5341\u5206\u306a\u30c7\u30fc\u30bf\u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u306a\u3044 1:\u89e3\u6790\u6210\u529f -1:\u89e3\u6790\u5931\u6557\n\/\/==============================================\nint CRecvFileThread::RecvSendFileEndPacket(SendFileEndReqRec *pbPacket)\n{\n    int         iRet = 0;\n    long        lDataSize, lOffset;\n\n    Locate(1, 13, 1);\n    fprintf(stderr, &#8220;End %s %s(%u)&#8221;, pbPacket-&gt;Stat.szOffset, pbPacket-&gt;Stat.szSize, timeGetTime());\n\n    if (m_iRecvFileStatus != RECVC_FILE_STAT_ING)\n    {\n        iRet = -1;              \/\/ \u9077\u79fb\u72b6\u614b\u30a8\u30e9\u30fc\u306f\u5207\u65ad\u3059\u308b\n        goto L_END;\n    }\n    lDataSize = atol(pbPacket-&gt;Stat.szSize);\n    lOffset = atol(pbPacket-&gt;Stat.szOffset);\n    if (lDataSize &gt; 0)\n    {\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u5931\u6557\u6642\u30a8\u30e9\u30fc\u3068\u3057\u3066\u5207\u65ad\n        if (lseek(m_fdDstFile, lOffset, SEEK_SET) == -1)\n        {\n            iRet = -1;\n            goto L_END;\n        }\n        if (write(m_fdDstFile, pbPacket-&gt;bData, lDataSize) != lDataSize)\n        {\n            iRet = -1;\n            goto L_END;\n        }\n    }\n    iRet = 1;\n    \/\/ \u2605\u5f8c\u7a0b\u9001\u4fe1\u5b8c\u4e86\u8981\u6c42\u6210\u529f\u3092\u8fd4\u3059\u3088\u3046\u306b\u3057\u307e\u3059\nL_END:\n    if (m_fdDstFile != -1)\n    {\n        close(m_fdDstFile);\n        if(iRet == -1)          \/\/ \u30a8\u30e9\u30fc\u6642\u524a\u9664\n            unlink(m_szFileName);\n    }\n    m_iRecvFileStatus = RECVC_FILE_STAT_IDLE;\n    m_fdDstFile = -1;\n    return(iRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/    \u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306f\u30be\u30f3\u30d3\u72b6\u614b\u304b\n\/\/      \u5225\u30b9\u30ec\u30c3\u30c9\u304b\u3089\u53c2\u7167\u3055\u308c\u308b\n\/\/ parameter\n\/\/    \u306a\u3057\n\/\/ return\n\/\/    0:\u6b63\u5e38 -1:\u30a8\u30e9\u30fc\u767a\u751f\n\/\/==============================================\nBOOL CRecvFileThread::IsZombie()\n{\n    BOOL    fRet;\n\n    m_pCMySyncObject-&gt;Lock();\n    fRet = m_fIamZombie;\n    m_pCMySyncObject-&gt;UnLock();\n    return(fRet);\n}<\/p>\n\n\n\n<p class=\"program_discription\">CSendRecvThread\u306bCRecvFileThread\u306e\u547c\u3073\u51fa\u3057(\u69cb\u7bc9\u30fb\u7834\u68c4)\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br>\u3044\u3064\u3067\u3082\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067CRecvFileThread\u3092\u69cb\u7bc9\u3057<br>\u958b\u59cb\u3057\u307e\u3059\u3002<br>CRecvFileThread\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f(Zombie\u72b6\u614b)\u3057\u3066\u3044\u305f\u3089CRecvFileThread\u3092\u7834\u68c4\u3057<br>\u81ea\u5206\u81ea\u8eab(CSendRecvThread)\u3092Zombie\u306b\u3057\u3001\u30e1\u30a4\u30f3\u30b9\u30ec\u30c3\u30c9\u304b\u3089\u5207\u65ad\u3092\u3055\u305b\u308b<br>\u3088\u3046\u306b\u3057\u307e\u3059\u3002<br>\u5148\u305a\u306f\u3001<strong>SendRecvThread.h<\/strong>\u3067\u3059\u3002\u5909\u66f4\u70b9\u306b\u306f\u2605\u3092\u4ed8\u3051\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010SendRecvThread.h\u3011\n#pragma once\n#include &#8220;ThreadJob.h&#8221;\n#include &#8220;define.h&#8221;         \/\/ RecvMessagePacket\u306e\u5f15\u6570\u306e\u305f\u3081\n\nclass CMySyncObject;        \/\/ \u3053\u306e\u30af\u30e9\u30b9\u306e\u4f7f\u7528\u3059\u308b\u3053\u3068\u3092\u5ba3\u8a00\nclass CRingBuff;            \/\/ CRingBuff\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\nclass CRecvFileThread;      \/\/ \u2605CRecvFileThread\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\n\n#define SEND_BUFF_SIZE      (1024 * 64)                 \/\/ \u9001\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u30b5\u30a4\u30ba\n#if 1\n#define SENDBUFSIZE         (1024 + sizeof(HeaderRec))  \/\/ \u4e00\u5ea6\u306b\u9001\u4fe1\u3059\u308b\u30b5\u30a4\u30ba\u306e\u6700\u5927\u5024(\u5171\u901a\u30d8\u30c3\u30c0\u5206\u3092\u52a0\u3048\u3066\u3042\u308a\u307e\u3059)\n#else\n#define SENDBUFSIZE         (1024 * 4)                  \/\/ TCP\u3067\u9001\u4fe1\u901f\u5ea6\u30921Mbps\u3088\u308a\u4e0a\u3052\u305f\u3044\u3068\u304d\u306f\u65ad\u7247\u5316\u51e6\u7406\u3092TCP\u306e\u30b9\u30bf\u30c3\u30af\u306b\u4efb\u305b\u308b\n                                                        \/\/ \u30b9\u30bf\u30c3\u30af(send)\u306b\u6e21\u3059\u30b5\u30a4\u30ba\u3092\u5897\u3084\u3059\n#endif\n#define RECV_BUFF_SIZE      (1024 * 64)                 \/\/ \u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u30b5\u30a4\u30ba\n#define RCVBUFSIZE          (1024 * 2)                  \/\/ \u4e00\u5ea6\u306b\u8aad\u3080\u6700\u5927\u53d7\u4fe1\u30b5\u30a4\u30ba\n\ntypedef struct\n{\n    SOCKET          fdClient;           \/\/ \u63a5\u7d9a\u6e08\u307f\u30bd\u30b1\u30c3\u30c8(accept\u306e\u7d50\u679c)\n    CMySyncObject   *pCMySyncObject;    \/\/ \u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\n} ConnectionInfoRec;\n\n\nclass CSendRecvThread :\n    public CThreadJob\n{\npublic:\n    CSendRecvThread(ConnectionInfoRec *pConInfo);   \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u6e21\u3059\n    ~CSendRecvThread();\n\n    \/\/ \u57fa\u5e95\u30af\u30e9\u30b9\u306e\u95a2\u6570\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b\n    \/\/ C++11\u3067\u660e\u793a\u7684\u306boverride\u3092\u66f8\u304f\u3053\u3068\u304c\u51fa\u6765\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\n    \/\/ \u57fa\u5e95\u30af\u30e9\u30b9\u306e\u5f53\u8a72\u95a2\u6570\u306bvirtual\u304c\u66f8\u3044\u3066\u3044\u306a\u3044\u3068\u30a8\u30e9\u30fc\u3092\u51fa\u3057\u3066\u304f\u308c\u307e\u3059\n    UINT DoWork() override;                         \/\/ DoRecv\u3067\u5b9f\u65bd\u3057\u3066\u3044\u308b\u5185\u5bb9\u3092\u8a18\u8ff0\n    BOOL SetSendData(char *pcData, int iSize);      \/\/ \u9001\u4fe1\u30c7\u30fc\u30bf\u306e\u8a2d\u5b9a            \n    int GetDataForDistributeChat(char **ppcData);   \/\/ \u30c1\u30e3\u30c3\u30c8\u5206\u914d\u7528\u30c7\u30fc\u30bf\u306e\u53d6\u5f97\n\n    BOOL IsZombie();                                \/\/ \u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306f\u30be\u30f3\u30d3\u72b6\u614b\u304b\n\nprivate:\n    ConnectionInfoRec *m_pConInfo;              \/\/ \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u6e21\u3055\u308c\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u683c\u7d0d\n                                                \/\/ \u3053\u306e\u30b9\u30ec\u30c3\u30c9\u5b9f\u884c\u4e2d\u9818\u57df\u304c\u78ba\u4fdd\u3055\u308c\u3066\u3044\u308b\u3053\u3068\n    BOOL m_fIamZombie;                          \/\/ \u30be\u30f3\u30d3\u72b6\u614b\u304b\u3069\u3046\u304b\u3092\u4fdd\u6301\n    CRingBuff *m_pCRingBuffSend;                \/\/ \u9001\u4fe1\u30c7\u30fc\u30bf\u683c\u7d0d\u7528\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\n    CRingBuff *m_pCRingBuffRecv;                \/\/ \u53d7\u4fe1\u30c7\u30fc\u30bf\u683c\u7d0d\u7528\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\n    CRingBuff *m_pCRingBuffForDistributeChat;   \/\/ \u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u914d\u4fe1\u3059\u308b\u305f\u3081\u306e\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\n\n    DWORD m_dwPrevSentTime;                     \/\/ \u524d\u56de\u9001\u4fe1\u3057\u305f\u6642\u523b(msec)\n    DWORD m_dwSendInterval;                     \/\/ \u6b21\u56de\u9001\u4fe1\u307e\u3067\u306e\u9593\u9694(msec)\n    CRecvFileThread *m_pCRecvFileThread;        \/\/ \u2605\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\n\n    int GetSendData(char **ppcData);            \/\/ \u9001\u4fe1\u30c7\u30fc\u30bf\u306e\u53d6\u5f97\n    BOOL SetDataForDistributeChat(char *pcData, int iSize);    \/\/ \u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u5206\u914d\u3059\u308b\u305f\u3081\u306b\u683c\u7d0d\u3059\u308b\n\n    int AnalyzeDataRecv();\n    int RecvMessagePacket(HeaderRec *pHeader);\n    int RecvFileSendPacket(HeaderRec *pHeader); \/\/ \u2605\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u53d7\u4fe1\u95a2\u6570\n\n    BOOL SendMessagePacket(char *pcData, int iSize);\n    DWORD CalcNextSendInterval(int iSentSize);  \/\/ \u6b21\u56de\u9001\u4fe1\u307e\u3067\u306e\u9593\u9694\n    BOOL CanSendNow(DWORD dwNow);               \/\/ \u9001\u4fe1\u3057\u3066\u826f\u3044\u6642\u523b\u306b\u306a\u3063\u305f\u304b\n\n    BOOL KillZombei();                          \/\/ \u2605\u3053\u306e\u30af\u30e9\u30b9\u304c\u4f5c\u3063\u305f\u4e0d\u8981(\u30a8\u30e9\u30fc\u767a\u751f)\u306b\u306a\u3063\u305f\u30b9\u30ec\u30c3\u30c9\u3092\u7834\u68c4\n};<\/p>\n\n\n\n<p class=\"program_discription\">\u6b21\u306b\u3001<strong>SendRecvThread.cpp<\/strong>\u3092\u898b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<br>\u5909\u66f4\u70b9\u306b\u306f\u2605\u3092\u4ed8\u3051\u307e\u3057\u305f\u3002<br>\u5909\u66f4\u306f\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3001\u30c7\u30b9\u30c8\u30e9\u30af\u30bf\u3068\u6b21\u306e\u30e1\u30bd\u30c3\u30c9\u3067\u3059\u3002<br>UINT CSendRecvThread::DoWork()<br>BOOL CSendRecvThread::AnalyzeDataRecv()<br>int CSendRecvThread::RecvFileSendPacket(HeaderRec *pHeader)<br>BOOL CSendRecvThread::KillZombei()<\/p>\n\n\n\n<p class=\"source_code\">\u3010SendRecvThread.cpp\u3011\n#include &#8220;SendRecvThread.h&#8221;\n#include &#8220;MySyncObject.h&#8221;       \/\/ CMySyncObject\u3092\u4f7f\u3046\u305f\u3081\n#include &#8220;RingBuff.h&#8221;           \/\/ CRingBuff\u3092\u4f7f\u3046\u305f\u3081\n#include &#8220;RecvFileThread.h&#8221;     \/\/ \u2605CRecvFileThread\u3092\u4f7f\u3046\u305f\u3081\n\n\/\/ \u9001\u4fe1\u901f\u5ea6\n#define     SEND_BPS    (1000000.0)     \/\/ \u9001\u4fe1\u901f\u5ea61Mbps\n\n\/\/==============================================\n\/\/ function\n\/\/      \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\n\/\/ parameter\n\/\/      ConnectionInfoRec *pConInfo    [in]\u6a5f\u80fd\u306b\u5fc5\u8981\u306a\u60c5\u5831\n\/\/ return\n\/\/      \u306a\u3057\n\/\/==============================================\nCSendRecvThread::CSendRecvThread(ConnectionInfoRec *pConInfo)\n{\n    m_pConInfo = pConInfo;\n    m_fIamZombie = FALSE;\n    m_pCRingBuffSend = new CRingBuff(SEND_BUFF_SIZE);   \/\/ \u9001\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u69cb\u7bc9\n    m_pCRingBuffRecv = new CRingBuff(RECV_BUFF_SIZE);   \/\/ \u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u69cb\u7bc9\n    m_pCRingBuffForDistributeChat = new CRingBuff(RECV_BUFF_SIZE);  \/\/ \u30c1\u30e3\u30c3\u30c8\u914d\u4fe1\u7528\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u69cb\u7bc9\n\n    m_dwPrevSentTime = 0;                               \/\/ \u521d\u56de\u9001\u4fe1\u306f\u3059\u3050\u306b\n    m_dwSendInterval = 0;                               \/\/ \n\n    m_pCRecvFileThread = new CRecvFileThread(this);     \/\/ \u2605\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u3092\u5e38\u306b\u4f7f\u3048\u308b\u3088\u3046\u306b\u6e96\u5099\u3059\u308b\n    m_pCRecvFileThread-&gt;Begin();\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u30c7\u30b9\u30c8\u30e9\u30af\u30bf\n\/\/ parameter\n\/\/      \u306a\u3057\n\/\/ return\n\/\/      \u306a\u3057\n\/\/==============================================\nCSendRecvThread::~CSendRecvThread()\n{\n    if (m_pCRecvFileThread != NULL)             \/\/ \u2605\u3053\u306e\u30af\u30e9\u30b9\u304c\u7834\u68c4\u3055\u308c\u308b\u3068\u304d\u306b\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u3092\u7834\u68c4\n    {\n        m_pCRecvFileThread-&gt;End();\n        m_pCRecvFileThread-&gt;WaitForEnd();\n    }\n    SAFE_DELETE(m_pCRecvFileThread)\n\n    SAFE_DELETE(m_pCRingBuffSend)               \/\/ \u9001\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u7834\u68c4\n    SAFE_DELETE(m_pCRingBuffRecv)               \/\/ \u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u7834\u68c4\n    SAFE_DELETE(m_pCRingBuffForDistributeChat)  \/\/ \u30c1\u30e3\u30c3\u30c8\u914d\u4fe1\u7528\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u7834\u68c4\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u6a5f\u80fd\u3092\u8a18\u8ff0\u3057\u305f\u95a2\u6570\n\/\/ parameter\n\/\/      \u306a\u3057\n\/\/ return\n\/\/      0:\u6b63\u5e38 -1:\u30a8\u30e9\u30fc\u767a\u751f\n\/\/==============================================\nUINT CSendRecvThread::DoWork()\n{\n    BOOL    fRet = TRUE;\n    char    szRecvBuffer[RCVBUFSIZE];       \/\/ \u53d7\u4fe1\u30d0\u30c3\u30d5\u30a1\n    int     iRecvSize;\n    pollfd  fds[1] = { 0 };\n    char    *pcData = NULL;                 \/\/ \u672a\u9001\u4fe1\u30c7\u30fc\u30bf\n    int     iSendSize = 0;                  \/\/ \u672a\u9001\u4fe1\u30c7\u30fc\u30bf\u30b5\u30a4\u30ba\n    DWORD   dwNow;                          \/\/ \u9001\u4fe1\u30c1\u30a7\u30c3\u30af\u3057\u305f\u6642\u523b\u3092\u899a\u3048\u308b\u305f\u3081\n\n    fprintf(stderr, &#8220;DoWork()\\n&#8221;);\n    fds[0].fd = m_pConInfo-&gt;fdClient;\n    while (!m_fStopFlag)\n    {\n        \/\/ \u2605\u81f4\u547d\u7684\u30a8\u30e9\u30fc\u767a\u751f\u306e\u30b9\u30ec\u30c3\u30c9\u3092\u7834\u68c4\u3057\u305f\u3068\u304d\u306f\u7d42\u4e86\n        \/\/ \u7d42\u4e86\u3059\u308b\u3068\u5f53\u8a72\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u5207\u65ad\u3055\u308c\u308b\n        if (KillZombei() == TRUE)\n        {\n            fRet = FALSE;\n            break;\n        }\n\n        \/\/ \u9001\u4fe1\u30c7\u30fc\u30bf\u304c\u3042\u308b\u304b\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u3092\u8abf\u3079\u308b\n        iSendSize = m_pCRingBuffSend-&gt;GetReadableSize();\n        fds[0].events = POLLIN | POLLRDHUP;     \/\/ \u53d7\u4fe1\u3068\u76f8\u624b\u5074\u304b\u3089\u306e\u5207\u65ad\u30a4\u30d9\u30f3\u30c8\u3092\u8a2d\u5b9a\n        \/\/ \u30c1\u30a7\u30c3\u30af\u306e\u305f\u3081\u306b\u73fe\u5728\u6642\u523b\u3092\u53d6\u5f97\u3059\u308b\n        dwNow = timeGetTime();\n        \/\/ \u9001\u4fe1\u53ef\u80fd\u6642\u523b\u304b\u3064\u672a\u9001\u4fe1\u30c7\u30fc\u30bf\u304c\u3042\u308b\u3068\u304d\u3060\u3051\u9001\u4fe1\u53ef\u80fd\u691c\u67fb\n        if ((iSendSize &gt; 0) &amp;&amp; (CanSendNow(dwNow) == TRUE))\n            fds[0].events |= POLLOUT;           \/\/ \u66f8\u304d\u8fbc\u307f\u53ef\u80fd\u3092\u8ffd\u52a0\n\n        poll(fds, 1, 10);\n        if (fds[0].revents &amp; POLLRDHUP)         \/\/ \u76f8\u624b\u5074\u304b\u3089\u306e\u5207\u65ad\n        {\n            fprintf(stderr, &#8220;Disconnected pollrdhup\\n&#8221;);\n            fRet = FALSE;\n            break;\n        }\n        if (fds[0].revents &amp; POLLERR)           \/\/ \u30a8\u30e9\u30fc\u767a\u751f\n        {\n            m_pConInfo-&gt;pCMySyncObject-&gt;Lock();\n            DispErrorMsg(&#8220;Err:DoWork&#8221;);\n            m_pConInfo-&gt;pCMySyncObject-&gt;UnLock();\n            fRet = FALSE;\n            break;\n        }\n        if (fds[0].revents &amp; POLLIN)            \/\/ \u53d7\u4fe1\u30c7\u30fc\u30bf\u30a4\u30d9\u30f3\u30c8\n        {\n            \/\/ \u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u7a7a\u304d\u304c\u3042\u308c\u3070\u53d7\u4fe1\u3059\u308b\n            \/\/ \u3053\u3053\u3067\u53d7\u4fe1\u3057\u306a\u3051\u308c\u3070\u3001\u6b21\u56de\u306erevents\u691c\u67fb\u3067\u53d7\u4fe1\u304c\u884c\u308f\u308c\u308b\n            iRecvSize = min(m_pCRingBuffRecv-&gt;GetWriteableSize(), RCVBUFSIZE);\n            if (iRecvSize &gt; 0)\n            {\n                if ((iRecvSize = recv(m_pConInfo-&gt;fdClient, szRecvBuffer, iRecvSize, 0)) &lt;= 0)\n                {\n                    m_pConInfo-&gt;pCMySyncObject-&gt;Lock();\n                    if (iRecvSize == 0)\n                        DispErrorMsg(&#8220;Disconnected recv&#8221;);\n                    else\n                        DispErrorMsg(&#8220;Err:recv&#8221;);\n                    m_pConInfo-&gt;pCMySyncObject-&gt;UnLock();\n                    fRet = FALSE;\n                    break;\n                }\n                else\n                {\n                    \/\/ \u53d6\u5f97\u3057\u305f\u30c7\u30fc\u30bf\u3059\u3050\u306b\u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u66f8\u304d\u3053\u3080\n                    \/\/ \u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u66f8\u304d\u8fbc\u3080\u306e\u306f\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u3060\u3051\u306a\u306e\u3067\u3001\u3059\u3079\u3066\u66f8\u304d\u8fbc\u3081\u308b\u306f\u305a\n                    m_pCRingBuffRecv-&gt;Write((LPBYTE)szRecvBuffer, iRecvSize);\n                }\n            }\n        }\n        \/\/ \u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u30c7\u30fc\u30bf\u306e\u89e3\u6790\u3092\u884c\u3046\n        \/\/ \u8907\u6570\u306e\u30d1\u30b1\u30c3\u30c8\u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308b\u306e\u3067\u3001revents\u306e\u7d50\u679c\u3068\u306f\u7121\u95a2\u4fc2\u306b\n        \/\/ \u89e3\u6790\u3092\u884c\u3046\u3088\u3046\u306b\u3059\u308b\n        if (AnalyzeDataRecv() == -1)\n        {\n            m_pConInfo-&gt;pCMySyncObject-&gt;Lock();\n            DispErrorMsg(&#8220;Err:Packet format&#8221;);\n            m_pConInfo-&gt;pCMySyncObject-&gt;UnLock();\n            fRet = FALSE;\n            break;\n        }\n        if (fds[0].revents &amp; POLLOUT)           \/\/ \u9001\u4fe1\u53ef\u80fd\u306a\u3089send\u5b9f\u65bd\n        {\n            \/\/ \u9001\u4fe1\u3057\u305f\u3044\u30c7\u30fc\u30bf\u306e\u53d6\u5f97(PATH_MTU\u3088\u308a\u5c0f\u3055\u304f\u306a\u308b\u3088\u3046\u306b\u53d6\u5f97\u3059\u308b)\n            iSendSize = GetSendData(&amp;pcData);\n            if (send(m_pConInfo-&gt;fdClient, pcData, iSendSize, 0) != iSendSize)\n            {\n                DispErrorMsg(&#8220;Err:send&#8221;);\n                fRet = FALSE;\n                break;\n            }\n            SAFE_FREE(pcData)\n            \/\/ \u9001\u4fe1\u6642\u523b\u3068\u6b21\u56de\u9001\u4fe1\u307e\u3067\u306e\u6642\u9593\u3092\u30bb\u30c3\u30c8\n            m_dwPrevSentTime = dwNow;\n            m_dwSendInterval = CalcNextSendInterval(iSendSize);\n        }\n    }\n    m_pConInfo-&gt;pCMySyncObject-&gt;Lock();\n    m_fIamZombie = TRUE;\n    m_pConInfo-&gt;pCMySyncObject-&gt;UnLock();\n    SAFE_FREE(pcData)\n    return((fRet == TRUE) ? 0 : -1);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u9001\u4fe1\u30c7\u30fc\u30bf\u306e\u8a2d\u5b9a\n\/\/      \u9001\u4fe1\u3067\u304d\u306a\u3044\u6642\u3001\u30a8\u30e9\u30fc\u3068\u3057\u3066\u5207\u65ad\u3092\u3059\u308b\u306e\u304c\u826f\u3044\u304b\n\/\/      \u306f\u8ff7\u3046\u3068\u3053\u308d\n\/\/ parameter\n\/\/      char    *pcData [in]\u9001\u4fe1\u30c7\u30fc\u30bf\n\/\/      int     iSize   [in]\u30c7\u30fc\u30bf\u9577\n\/\/ return\n\/\/      TRUE\/FALSE\n\/\/==============================================\nBOOL CSendRecvThread::SetSendData(char *pcData, int iSize)\n{\n    BOOL    fRet = FALSE;\n\n    \/\/ \u9001\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u7a7a\u304d\u304c\u306a\u3044\u3068\u304d\u306f\u66f8\u304d\u8fbc\u307e\u306a\u3044\n    fRet = m_pCRingBuffSend-&gt;Write((LPBYTE)pcData, iSize);\n    return(fRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u9001\u4fe1\u30c7\u30fc\u30bf\u306e\u53d6\u5f97\n\/\/ parameter\n\/\/      char **ppcData  [in\/out]\u9001\u4fe1\u30c7\u30fc\u30bf\n\/\/ return\n\/\/      \u30c7\u30fc\u30bf\u9577\n\/\/==============================================\nint CSendRecvThread::GetSendData(char **ppcData)\n{\n    int iSize = 0;\n\n    \/\/ \u9001\u4fe1\u30c7\u30fc\u30bf\u304c\u3042\u308b\u304b\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306e\u30c7\u30fc\u30bf\u30b5\u30a4\u30ba\u3092\u8abf\u3079\u308b\n    if ((iSize = m_pCRingBuffSend-&gt;GetReadableSize()) &gt; 0)\n    {\n        \/\/ \u9001\u4fe1\u30b5\u30a4\u30ba\u3092PATH_MTU\u3088\u308a\u5c0f\u3055\u304f\u3057\u3066\u304a\u304f(1024+\u5171\u901a\u30d8\u30c3\u30c0\u306a\u3089\u5927\u4e08\u592b)\n        iSize = min(iSize, SENDBUFSIZE);\n        *ppcData = (char *)calloc(iSize, sizeof(char));\n        iSize = m_pCRingBuffSend-&gt;Read((LPBYTE)*ppcData, iSize);\n    }\n    return(iSize);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u5206\u914d\u3059\u308b\u305f\u3081\u306b\u683c\u7d0d\u3059\u308b\n\/\/ parameter\n\/\/      char    *pcData [in]\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u30d1\u30b1\u30c3\u30c8\n\/\/      int     iSize   [in]\u30d1\u30b1\u30c3\u30c8\u9577\n\/\/ return\n\/\/      TRUE\/FALSE\n\/\/==============================================\nBOOL CSendRecvThread::SetDataForDistributeChat(char *pcData, int iSize)\n{\n    BOOL    fRet = FALSE;\n\n    \/\/ \u683c\u7d0d\u7528\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u7a7a\u304d\u304c\u306a\u3044\u3068\u304d\u306f\u66f8\u304d\u8fbc\u307e\u306a\u3044\n    fRet = m_pCRingBuffForDistributeChat-&gt;Write((LPBYTE)pcData, iSize);\n    return(fRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u30c1\u30e3\u30c3\u30c8\u5206\u914d\u7528\u30c7\u30fc\u30bf\u306e\u53d6\u5f97\n\/\/      \u30d1\u30b1\u30c3\u30c8\u5358\u4f4d\u3067\u53d6\u308a\u51fa\u3059\n\/\/      \u4eca\u56de\u306f\uff11\u30d1\u30b1\u30c3\u30c8\u5206\n\/\/ parameter\n\/\/      char **ppcData  [in\/out]\u30c1\u30e3\u30c3\u30c8\u8ee2\u9001\u7528\u30c7\u30fc\u30bf\n\/\/ return\n\/\/      \u30c7\u30fc\u30bf\u9577\n\/\/==============================================\nint CSendRecvThread::GetDataForDistributeChat(char **ppcData)\n{\n    int         iSize = 0, iStoreSize, iPacketSize;\n    HeaderRec   Header;\n\n    if ((iStoreSize = m_pCRingBuffForDistributeChat-&gt;GetReadableSize()) &gt;= sizeof(HeaderRec))\n    {\n        \/\/ \u30d8\u30c3\u30c0\u90e8\u3092\u4eee\u308a\u8aad\u307f\u8fbc\u307f\u3059\u308b\n        m_pCRingBuffForDistributeChat-&gt;ReadWithoutUpdateHeadPoint((LPBYTE)&amp;Header, sizeof(HeaderRec));\n        iPacketSize = ntohs(Header.wDataLen) + sizeof(HeaderRec);\n        if (iStoreSize &gt;= iPacketSize)\n        {\n            *ppcData = (char *)calloc(iPacketSize, sizeof(char));\n            iSize = m_pCRingBuffForDistributeChat-&gt;Read((LPBYTE)*ppcData, iPacketSize);\n        }\n    }\n    return(iSize);\n}\n\n\n\/\/==============================================\n\/\/ function\n\/\/      \u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306f\u30be\u30f3\u30d3\u72b6\u614b\u304b\n\/\/      \u5225\u30b9\u30ec\u30c3\u30c9\u304b\u3089\u53c2\u7167\u3055\u308c\u308b\n\/\/ parameter\n\/\/      \u306a\u3057\n\/\/ return\n\/\/      0:\u6b63\u5e38 -1:\u30a8\u30e9\u30fc\u767a\u751f\n\/\/==============================================\nBOOL CSendRecvThread::IsZombie()\n{\n    BOOL    fRet;\n\n    m_pConInfo-&gt;pCMySyncObject-&gt;Lock();\n    fRet = m_fIamZombie;\n    m_pConInfo-&gt;pCMySyncObject-&gt;UnLock();\n    return(fRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u53d7\u4fe1\u30c7\u30fc\u30bf\u306e\u89e3\u6790\n\/\/      \u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u30c7\u30fc\u30bf\u3092\u8abf\u3079\u308b\n\/\/ parameter\n\/\/      \u306a\u3057\n\/\/ return\n\/\/      0:\u30d1\u30b1\u30c3\u30c8\u304c\u63c3\u3063\u3066\u3044\u306a\u3044\n\/\/      1:\u30d1\u30b1\u30c3\u30c8\u3092\u53d7\u4fe1\u3057\u305f\u306e\u3067\u51e6\u7406\u3092\u884c\u3063\u305f\n\/\/      -1:\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\n\/\/==============================================\nBOOL CSendRecvThread::AnalyzeDataRecv()\n{\n    int         iRet = 0;\n    HeaderRec   Header;\n    WORD        wCmd;\n    \/\/ \u30c7\u30fc\u30bf\u30b5\u30a4\u30ba\u3092\u8abf\u3079\u308b\n    int         iSize = m_pCRingBuffRecv-&gt;GetReadableSize();\n\n    if (iSize &lt; sizeof(HeaderRec))          \/\/ \u30d8\u30c3\u30c0\u30b5\u30a4\u30ba\u306b\u6e80\u305f\u306a\u3044\u3068\u304d\u306f\u4f55\u3082\u3057\u306a\u3044\n        goto L_END;\n\n    \/\/ \u30d8\u30c3\u30c0\u90e8\u3092\u501f\u308a\u8aad\u307f\u8fbc\u307f\u3059\u308b\n    m_pCRingBuffRecv-&gt;ReadWithoutUpdateHeadPoint((LPBYTE)&amp;Header, sizeof(HeaderRec));\n    \/\/ \u30d8\u30c3\u30c0\u90e8\u306e\u89e3\u6790\n    if (memcmp(Header.bMagicData, MAGIC_STRING, strlen(MAGIC_STRING)) != 0)\n    {\n        iRet = -1;                          \/\/ \u8b58\u5225\u5b50\u304c\u9055\u3046\u306e\u3067\u30a8\u30e9\u30fc\n        goto L_END;\n    }\n    wCmd = ntohs(Header.wCommand);\n    Locate(1, 10, 1);\n    fprintf(stderr, &#8220;CMD:%d&#8221;, wCmd);\n\n    switch (wCmd)\n    {\n        case CMD_MSG_DATA:\n            iRet = RecvMessagePacket(&amp;Header);\n            break;\n        \/\/ \u2605\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9(C-&gt;S)\u3092\u51e6\u7406\u3059\u308b\n        case CMD_SEND_FILE_START_REQ:\n        case CMD_SEND_FILE_ING:\n        case CMD_SEND_FILE_END_REQ:\n        case CMD_SEND_FILE_ABORT_REQ:\n            iRet = RecvFileSendPacket(&amp;Header);\n            break;\n        default:                            \/\/ \u77e5\u3089\u306a\u3044\u30b3\u30de\u30f3\u30c9\n            iRet = -1;\n            break;\n    }\nL_END:\n    return(iRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u30e1\u30c3\u30bb\u30fc\u30b8\u30b3\u30de\u30f3\u30c9\u306e\u53d7\u4fe1\n\/\/ parameter\n\/\/      HeaderRec *pHeader  [in]\u4eee\u8aad\u307f\u3057\u305f\u30d8\u30c3\u30c0\n\/\/ return\n\/\/      0:\u30d1\u30b1\u30c3\u30c8\u304c\u63c3\u3063\u3066\u3044\u306a\u3044\n\/\/      1:\u30d1\u30b1\u30c3\u30c8\u3092\u53d7\u4fe1\u3057\u305f\u306e\u3067\u51e6\u7406\u3092\u884c\u3063\u305f\n\/\/      -1:\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\n\/\/==============================================\nBOOL CSendRecvThread::RecvMessagePacket(HeaderRec *pHeader)\n{\n    int         iRet = 0;\n    MsgDataRec  *pMsgData;\n    int         iMsgSize, iSize;\n    char        *pszMsg = NULL;\n\n    iMsgSize = ntohs(pHeader-&gt;wDataLen);\n    \/\/ \u30c7\u30fc\u30bf\u304c\u8db3\u308a\u306a\u3044\u3068\u304d\u306f\u4f55\u3082\u3057\u306a\u3044\n    iSize = m_pCRingBuffRecv-&gt;GetReadableSize();\n    if (iSize &lt; iMsgSize + sizeof(HeaderRec))\n        goto L_END;\n    \/\/ \u30d1\u30b1\u30c3\u30c8\u5168\u4f53\u3092\u53d7\u4fe1\u3057\u3066\u3044\u308b\u306e\u3067\u8aad\u307f\u8fbc\u307f\u3092\u5b9f\u65bd\u3059\u308b\n    pMsgData = (MsgDataRec *)calloc(iMsgSize + sizeof(HeaderRec), sizeof(BYTE));\n    m_pCRingBuffRecv-&gt;Read((LPBYTE)pMsgData, iMsgSize + sizeof(HeaderRec));\n    \/\/ NULL\u30bf\u30fc\u30df\u30cd\u30fc\u30c8\u5206\u3092\u8ffd\u52a0\u3057\u3066\u78ba\u4fdd\n    pszMsg = (char *)calloc(iMsgSize + 1, sizeof(char));\n    memcpy(pszMsg, pMsgData-&gt;bMsgData, iMsgSize);\n\n    \/\/ \u30c1\u30e3\u30c3\u30c8\u9001\u4fe1\u306e\u305f\u3081\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u30c7\u30fc\u30bf\u3092\u30d1\u30b1\u30c3\u30c8\u5316\u3057\u3066\u30bb\u30c3\u30c8\n    SendMessagePacket(pszMsg, iMsgSize);\n\n    m_pConInfo-&gt;pCMySyncObject-&gt;Lock();\n    fprintf(stderr, &#8220;Msg:recv %s\\n&#8221;, pszMsg);\n    m_pConInfo-&gt;pCMySyncObject-&gt;UnLock();\n\n    SAFE_FREE(pMsgData)\n    SAFE_FREE(pszMsg)\n    iRet = 1;\nL_END:\n    return(iRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u2605\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u306e\u53d7\u4fe1\n\/\/      \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9(C-&gt;S)\u3092CRecvThread\u306b\u6e21\u3059\u3060\u3051\n\/\/ parameter\n\/\/      HeaderRec *pHeader  [in]\u4eee\u8aad\u307f\u3057\u305f\u30d8\u30c3\u30c0\n\/\/ return\n\/\/      0:\u30d1\u30b1\u30c3\u30c8\u304c\u63c3\u3063\u3066\u3044\u306a\u3044, \u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u5074\u304c\u6e80\u676f\n\/\/      1:\u30d1\u30b1\u30c3\u30c8\u3092\u53d7\u4fe1\u3057\u305f\u306e\u3067\u51e6\u7406\u3092\u884c\u3063\u305f\n\/\/      -1:\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\n\/\/==============================================\nint CSendRecvThread::RecvFileSendPacket(HeaderRec *pHeader)\n{\n    int     iRet = 0;\n    int     iDataSize, iSize, iPacketSize;\n    LPBYTE  pbPacket = NULL;\n\n    iDataSize = ntohs(pHeader-&gt;wDataLen);\n    iPacketSize = iDataSize + sizeof(HeaderRec);\n\n    iSize = m_pCRingBuffRecv-&gt;GetReadableSize();\n    if (iSize &lt; iPacketSize)\n        goto L_END;\n    pbPacket = (LPBYTE)calloc(iPacketSize, sizeof(BYTE));\n    \/\/ \u30d1\u30b1\u30c3\u30c8\u5168\u4f53\u3092\u4eee\u8aad\u307f\n    m_pCRingBuffRecv-&gt;ReadWithoutUpdateHeadPoint(pbPacket, iPacketSize);\n    if (m_pCRecvFileThread != NULL)\n    {\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u306b\u6e21\u305b\u305f\u3089\u8aad\u307f\u8fbc\u3093\u3060\u3053\u3068\u306b\u3059\u308b\n        if (m_pCRecvFileThread-&gt;m_pCRingBuffCmd-&gt;Write(pbPacket, iPacketSize) == TRUE)\n        {\n            m_pCRingBuffRecv-&gt;UpdateHeadPoint(iPacketSize);\n            iRet = 1;\n        }\n    }\n    else\n    {\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u30b9\u30ec\u30c3\u30c9\u304c\u3044\u306a\u3051\u308c\u3070\u30a8\u30e9\u30fc\u5207\u65ad\n        m_pCRingBuffRecv-&gt;UpdateHeadPoint(iPacketSize);\n        iRet = -1;\n    }\n    SAFE_FREE(pbPacket);\nL_END:\n    return(iRet);\n}\n\n\n\n\/\/==============================================\n\/\/ function\n\/\/      \u30e1\u30c3\u30bb\u30fc\u30b8\u30d1\u30b1\u30c3\u30c8\u306e\u9001\u4fe1\n\/\/      \u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u8ee2\u9001\u3059\u308b\u305f\u3081\u306e\u30a8\u30ea\u30a2\u306b\n\/\/      \u683c\u7d0d\u3059\u308b\n\/\/ parameter\n\/\/      char    *pcData [in]UTF-8\u30c7\u30fc\u30bf(NULL\u30bf\u30fc\u30df\u30cd\u30fc\u30c8\u306a\u3057)\n\/\/      int     iSize   [in]\u30c7\u30fc\u30bf\u30b5\u30a4\u30ba\n\/\/ retun\n\/\/      \u306a\u3057\n\/\/==============================================\nBOOL CSendRecvThread::SendMessagePacket(char *pcData, int iSize)\n{\n    MsgDataRec  *pMsgData = NULL;\n    int         iPacketSize = sizeof(HeaderRec) + iSize;        \/\/ \u30d1\u30b1\u30c3\u30c8\u30b5\u30a4\u30ba\n    BOOL        fRet = FALSE;\n\n    pMsgData = (MsgDataRec *)calloc(iPacketSize, sizeof(BYTE)); \/\/ \u30d1\u30b1\u30c3\u30c8\u5168\u4f53\u306e\u30a8\u30ea\u30a2\u3092\u78ba\u4fdd\n\n    memcpy(pMsgData-&gt;header.bMagicData, MAGIC_STRING, strlen(MAGIC_STRING));\n    pMsgData-&gt;header.wCommand = htons(CMD_MSG_DATA);\n    pMsgData-&gt;header.wDataLen = htons(iSize);\n\n    memcpy(pMsgData-&gt;bMsgData, pcData, iSize);\n    \/\/ \u30c1\u30e3\u30c3\u30c8\u9001\u4fe1\u306e\u305f\u3081\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u30d1\u30b1\u30c3\u30c8\u30c7\u30fc\u30bf\u3092\u30bb\u30c3\u30c8\n    fRet = SetDataForDistributeChat((char *)pMsgData, iPacketSize);\n\n    SAFE_FREE(pMsgData)\n    return(fRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u6b21\u306e\u9001\u4fe1\u307e\u3067\u306e\u9593\u9694(msec)\u3092\u6c42\u3081\u308b\n\/\/ parameter\n\/\/      int iSentSize [in]\u9001\u4fe1\u3057\u305f\u30b5\u30a4\u30ba\n\/\/ return\n\/\/      msec\n\/\/==============================================\nDWORD CSendRecvThread::CalcNextSendInterval(int iSentSize)\n{\n    DWORD   dwInterval = 0;\n    double  dbBytePerSec = SEND_BPS \/ 8.0;\n    double  dbCountPerSec;\n\n    if (iSentSize == 0)\n        goto L_END;\n    dbCountPerSec = dbBytePerSec \/ (double)iSentSize;\n    dwInterval = DWORD(1000.0 \/ dbCountPerSec);\n\nL_END:\n    return(dwInterval);\n}\n\n\n\/\/==============================================\n\/\/ function\n\/\/      \u4eca\u9001\u4fe1\u53ef\u80fd\u6642\u523b\u304b\n\/\/ parameter\n\/\/      DWORD dwNow     [in]\u73fe\u5728\u6642\u523b\n\/\/ return\n\/\/      TRUE\/FALSE\n\/\/==============================================\nBOOL CSendRecvThread::CanSendNow(DWORD dwNow)\n{\n    BOOL    fRet = FALSE;\n\n    if (GetdwInterval(dwNow, m_dwPrevSentTime) &gt;= m_dwSendInterval)\n        fRet = TRUE;\n\n    return(fRet);\n}\n\n\/\/==============================================\n\/\/ function\n\/\/      \u2605\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u304c\u4f5c\u3063\u305f\u30b9\u30ec\u30c3\u30c9\u304c\u7121\u52b9(\u81f4\u547d\u7684\u30a8\u30e9\u30fc)\u306e\u6642\u7834\u68c4\n\/\/      \u7834\u68c4\u3057\u305f\u3068\u304d\u306f\u5207\u65ad\u51e6\u7406\u306e\u305f\u3081\u306b CSendRecvThread\u3082\u7d42\u308f\u308b\n\/\/ parameter\n\/\/      \u306a\u3057\n\/\/ return\n\/\/      TRUE:\u81f4\u547d\u7684\u30a8\u30e9\u30fc\u3067\u7834\u68c4\u3057\u305f\/FALSE:\u81f4\u547d\u7684\u30a8\u30e9\u30fc\u306a\u3057\n\/\/==============================================\nBOOL CSendRecvThread::KillZombei()\n{\n    BOOL    fRet = FALSE;\n\n    if (m_pCRecvFileThread != NULL)\n    {\n        if (m_pCRecvFileThread-&gt;IsZombie() == TRUE)\n        {\n            m_pCRecvFileThread-&gt;End();\n            m_pCRecvFileThread-&gt;WaitForEnd();\n            SAFE_DELETE(m_pCRecvFileThread)\n            fRet = TRUE;\n        }\n    }\n    return(fRet);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u3053\u308c\u3067\u3001<a href=\"https:\/\/www.oji-koji.com\/pro-files\/SimpleServerTransFileRingSpeed2Linux.zip\">SimpleServerTransFile(Linux)<\/a>\u306b\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u6a5f\u80fd\u304c\u5165\u308a\u307e\u3057\u305f\u3002<br>\u524d\u56de\u4f5c\u6210\u3057\u305fSimpleClientTransFile\u3068\u4e00\u7dd2\u306b\u52d5\u304b\u3057\u3066\u3001\u30d5\u30a1\u30a4\u30eb\u9001\u53d7\u4fe1\u3092<br>\u3084\u3063\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<br>\u901f\u5ea6\u3092\u4e0a\u3052\u3066(1Mbps\u4ee5\u4e0a)\u9001\u53d7\u4fe1\u3057\u305f\u3044\u3068\u304d\u306f\u3001SimpleClientTransFile\u306e<br>SEND_BPS\u3068SENDBUFSIZE\u3092\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br>\u4f8b<br>#define  SEND_BPS     (1000000.0 * 2.0) \/\/ \u9001\u4fe1\u901f\u5ea62Mbps<br>#define  SENDBUFSIZE  (1024 * 4)<br>\u3053\u306e\u3068\u304d\u3001\u30d1\u30b1\u30c3\u30c8\u30ad\u30e3\u30d7\u30c1\u30e3\u30bd\u30d5\u30c8(WireShark\u306a\u3069)\u3067\u898b\u3066\u307f\u308b\u3068<br>TCP\u306e\u30d1\u30b1\u30c3\u30c8\u304cMTU\u306e\u7bc4\u56f2\u306b\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u304c\u5206\u5272\u3057\u3066\u304f\u308c\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><a href=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecvCapture.png\" data-rel=\"lightbox-gallery-N7tsSbof\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecvCapture-1024x484.png\" alt=\"\" class=\"wp-image-1859\" width=\"768\" height=\"363\" srcset=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecvCapture-1024x484.png 1024w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecvCapture-300x142.png 300w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecvCapture-768x363.png 768w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/12\/SendRecvCapture.png 1121w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption>\u3053\u306e\u8a2d\u5b9a\u3067\u52d5\u4f5c\u3055\u305b\u305f\u3068\u304d\u306e\u30d1\u30b1\u30c3\u30c8\u30ad\u30e3\u30d7\u30c1\u30e3(WiFi\u7d4c\u7531)<\/figcaption><\/figure>\n\n\n\n<p>\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u6a5f\u80fd\u304c\u5165\u3063\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<br><a href=\"https:\/\/www.oji-koji.com\/pro-files\/SimpleServerTransFileRingSpeed2Linux.zip\">SimpleServerTransFile for Linux<\/a><br><a href=\"https:\/\/www.oji-koji.com\/pro-files\/SimpleServerTransFileRingSpeed2Win.zip\">SimpleServerTransFile for Windows<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4eca\u56de\u306f\u53d7\u4fe1\u5074(\u30b5\u30fc\u30d0)\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u8003\u3048\u3066\u307f\u307e\u3057\u3087\u3046\u3002CSendRecvThraed\u306e\u53d7\u4fe1\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u683c\u7d0d\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30b3\u30de\u30f3\u30c9\u3092CRecvFileThread\u306e\u30d5\u30a1\u30a4\u30eb\u53d7\u4fe1\u7528\u306e\u30ea\u30f3\u30b0\u30d0\u30c3\u30d5\u30a1\u306b\u683c\u7d0d\u3057\u307e\u3059\u3002CRe [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":129,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_locale":"ja","_original_post":"https:\/\/www.oji-koji.com\/?p=1835","footnotes":""},"categories":[9],"tags":[],"class_list":["post-1835","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-networkprograming2","ja"],"_links":{"self":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1835"}],"version-history":[{"count":28,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1835\/revisions"}],"predecessor-version":[{"id":3101,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1835\/revisions\/3101"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/media\/129"}],"wp:attachment":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1835"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1835"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}