Windows¤ÇC/C++¤Ç¥Í¥Ã¥È¥ï¡¼¥¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¤ò¤ä¤Ã¤Æ¤ß¤è¤¦¤È»×¤¤¤Þ¤¹ ¥Í¥Ã¥È¥ï¡¼¥¯¥×¥í¥°¥é¥à¤Ï´ðËÜŪ¤Ë¥½¥±¥Ã¥È¤È¸Æ¤Ð¤ì¤ë¥³¥Í¥¯¥¿¡¼¤Ç¥³¥ó¥Ô¥å¡¼¥¿Æ±»Î¤ò·Ò¤®¤Þ¤¹ ¤Ê¤Î¤Ç¥½¥±¥Ã¥È¤ò»È¤¦¥Í¥Ã¥È¥ï¡¼¥¯¥×¥í¥°¥é¥ß¥ó¥°¤Ï¥½¥±¥Ã¥È¥×¥í¥°¥é¥ß¥ó¥°¤È¤â¸Æ¤Ð¤ì¤Þ¤¹ Linux¤Ê¤É¤Ç¤Ï¤½¤³¤½¤³½ñÀÒ¤¬¤¢¤ê¤Þ¤¹¤¬ Windows¤Ç¤ä¤í¤¦¤È¤¹¤ë¤È»×¤Ã¤¿¤è¤ê½ñÀÒ¤¬¤¢¤ê¤Þ¤»¤ó ¤Á¤Ê¤ß¤ËWindows¤Ç¤Î¥½¥±¥Ã¥È¥×¥í¥°¥é¥ß¥ó¥°¤òWinsock¤È¸Æ¤Ó¤Þ¤¹ ¥µ¡¼¥Ð¡¼¥×¥í¥°¥é¥à¤È¥¯¥é¥¤¥¢¥ó¥È¥×¥í¥°¥é¥à¤ÎÆó¤Ä¤òÍÑ°Õ¤·¤Æ¤ä¤é¤Ê¤¤¤È¤¤¤±¤Ê¤¤¤Î¤Ç ¥Æ¥¹¥È¤ª¤è¤Ó¥Ç¥Ð¥Ã¥¯¤¬¤«¤Ê¤êÂçÊѤǤ¹ Àè¤Ë»²¹Í¤Ë¤Ê¤ë¥µ¥¤¥È¤È½ñÀÒ¤òµó¤²¤ÆÃÖ¤¤Þ¤¹ ¥µ¥¤¥È¡§ Geek¤Ê¥Ú¡¼¥¸ http://www.geekpage.jp/programming/winsock/ ½ñÀÒ¡§ ǤǤâ¤ï¤«¤ë¥Í¥Ã¥È¥ï¡¼¥¯¥×¥í¥°¥é¥ß¥ó¥° WinSock2¥×¥í¥°¥é¥ß¥ó¥° ²þÄûÂ裲ÈÇ¡ÊÀäÈǤʤΤǥ¢¥Þ¥¾¥ó¤È¤«¤ÇÇ㤦¤·¤«¤Ê¤¤¤«¤â¡¦¡¦¡¦¤Ç¤â¹â¤¤¡Ë Àè¤ËÂè°ì²ó¤ÈÂèÆó²ó¤Ç»È¤¦¥µ¡¼¥Ð¡¼¤È¥¯¥é¥¤¥¢¥ó¥È¤Î¥×¥í¥°¥é¥à¤òµó¤²¤ÆÃÖ¤¤Þ¤¹ &ref(ServerClient2008.zip); Àµ¤·¤¯Æ°ºî¤µ¤»¤ë¤Ë¤Ï¥µ¡¼¥Ð¦¥×¥í¥°¥é¥à¤òµ¯Æ°¤µ¤»¤Æ¤«¤é ¥¯¥é¥¤¥¢¥ó¥È¦¥×¥í¥°¥é¥à¤òµ¯Æ°¤·¤Þ¤¹ ¥µ¡¼¥Ð¥×¥í¥°¥é¥à¤òµ¯Æ°¤µ¤»¡¢ ¥¯¥é¥¤¥¢¥ó¥È¥×¥í¥°¥é¥à¤òƱ»þ¤ËÊ£¿ôµ¯Æ°¤µ¤»¤Æ¤ß¤Æ¤¯¤À¤µ¤¤ ¥µ¡¼¥Ð1¤Ä¤ËÂФ·Ê£¿ô¤Î¥¯¥é¥¤¥¢¥ó¥È¤¬¥¢¥¯¥»¥¹¤Ç¤¤ë¤Ï¤º¤Ç¤¹ w¥¡¼¡¢a¥¡¼¡¢s¥¡¼¡¢d¥¡¼¤Ç°ÜÆ°¤¬¤Ç¤¤Þ¤¹ ;ÎϤ¬¤¢¤ì¤Ð¡¢robot¥Õ¥©¥ë¥À¡¼¤Î¥×¥í¥°¥é¥à¤âµ¯Æ°¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤ ¤³¤Á¤é¤Ï¥¯¥é¥¤¥¢¥ó¥È¤Î¥×¥í¥°¥é¥à¤Î²þ¤ÈǤǰìÄê»þ´Ö¤´¤È¤Ë¼«Æ°Åª¤Ë°ÜÆ°¤·¤Þ¤¹ &ref(ServerClient.JPG); ------------ ¥µ¡¼¥Ð¡¼¥×¥í¥°¥é¥à¤Î¼ê½ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹ ¡WSAStartup WinSock¥é¥¤¥Ö¥é¥ê¤Î½àÈ÷ ¢socket ¥½¥±¥Ã¥È¤ÎºîÀ® £bind ¥µ¡¼¥Ð¤Î¥¢¥É¥ì¥¹¤È¥½¥±¥Ã¥È¤ò¥Ð¥¤¥ó¥É ¤listen ÂÔ¤Á¼õ¤±½àÈ÷ ¥accept ¥½¥±¥Ã¥ÈÀܳ ¦recv,send ¥Ç¡¼¥¿Á÷¼õ¿®¡Ê·«¤êÊÖ¤·¡Ë §closesocket ¥½¥±¥Ã¥È¤òÊĤ¸¤ë ¨WSACleanup WinSock¥é¥¤¥Ö¥é¥ê¤Î¸å½èÍý ¶ñÂÎŪ¤Ê¼ÂÁõ¤ÏServer.cpp¤ò¸«¤Æ¤¯¤À¤µ¤¤ ½çÈÖ¤ËÀâÌÀ¤·¤Þ¤¹ ----------- ¤Þ¤º¡¤Ç¤¹(¥³¥ó¥¹¥È¥é¥¯¥¿) CServer::CServer():m_ServerSocket(INVALID_SOCKET) { // Windows ¤Î¾ì¹ç WSADATA data; WSAStartup(MAKEWORD(2,0), &data); } WSAStartup¤ÇWinsock¤Î¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó»ØÄê¤ò¤·¤Þ¤¹ MAKEWORD(2,0)¤ÏWinsock2.0¤ò»È¤¦¤³¤È¤ò¼¨¤·¤Þ¤¹ Winsock¥é¥¤¥Ö¥é¥ê¤òÆɤ߹þ¤à¤³¤È¤Ç¢°Ê¹ß¤Î¥½¥±¥Ã¥È´Ø·¸¤Î´Ø¿ô¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹ ¤½¤Î¤Þ¤Þ»È¤Ã¤Æ¤¯¤À¤µ¤¤ ------------- ¤Ä¤®¤Ë¢¡Á¤¤ò°ìµ¤¤Ë¤ä¤ê¤Þ¤¹(Listen¥á¥½¥Ã¥É) void CServer::Listen(u_short PORT) { // sockaddr_in ¹½Â¤ÂΤΥ»¥Ã¥È memset(&m_ServerAddr, 0, sizeof(m_ServerAddr)); m_ServerAddr.sin_port = htons(PORT); m_ServerAddr.sin_family = AF_INET; m_ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); // ¥½¥±¥Ã¥È¤ÎÀ¸À®¡Ê¥¹¥È¥ê¡¼¥à·¿¡Ë m_ServerSocket = socket(AF_INET, SOCK_STREAM, 0); // ¥½¥±¥Ã¥È¤Î¥Ð¥¤¥ó¥É bind(m_ServerSocket, (struct sockaddr *) &m_ServerAddr, sizeof(m_ServerAddr)); // Àܳ¤Îµö²Ä listen(m_ServerSocket, 5); // ¤³¤³¤Ç¡¢¥Î¥ó¥Ö¥í¥Ã¥¥ó¥°¤ËÀßÄꤷ¤Æ¤¤¤Þ¤¹¡£ // val = 0¤Ç¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¤ËÀßÄê¤Ç¤¤Þ¤¹¡£ // ¥½¥±¥Ã¥È¤Î½é´üÀßÄê¤Ï¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¤Ç¤¹¡£ u_long val=1; ioctlsocket(m_ServerSocket, FIONBIO, &val); } ¤Þ¤º¡¢sockaddr_in¹½Â¤ÂΤ˥µ¡¼¥Ð¦¤ÎÂÔ¤Á¼õ¤±¥Ý¡¼¥ÈÈÖ¹æ¤ÈIP¥¢¥É¥ì¥¹¤ò»ØÄꤷ¤Þ¤¹ ¥Ý¡¼¥ÈÈÖ¹æ¤È¤Ï¡¢¥³¥ó¥Ô¥å¡¼¥¿¤¬¥Ç¡¼¥¿ÄÌ¿®¤ò¹Ô¤¦ºÝ¤ËÄÌ¿®Àè¤Î¥×¥í¥°¥é¥à¤òÆÃÄꤹ¤ë¤¿¤á¤ÎÈÖ¹æ¤Î¤³¤È¤Ç¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¦¤«¤é¥µ¡¼¥Ð¡¼¤Ë·Ò¤°¤È¤¤Ï¥µ¡¼¥Ð¦¤Î»ØÄê¥Ý¡¼¥ÈÈÖ¹æ¤ÈƱ¤¸ÈÖ¹æ¤ò»È¤Ã¤ÆÀܳ¤·¤Þ¤¹¡£ ¥µ¡¼¥Ð¦¤Î¥Ý¡¼¥ÈÈÖ¹æ»ØÄê¤Ë¤Ïsin_port¥á¥ó¥Ð¤Ë¥Ý¡¼¥ÈÈÖ¹æ¤òÆþ¤ì¤Þ¤¹¡£ ¤³¤³¤ÇPORT¤¬¥Ý¡¼¥ÈÈÖ¹æ¡ÊÀ°¿ô¡Ë¤ËÅö¤¿¤ê¤Þ¤¹¤¬¡¢ 0¡Á1024¤Þ¤Ç¤ÎÈÖ¹æ¤Ï¥¦¥§¥ë¥Î¥¦¥ó¥Ý¡¼¥È¤È¸Æ¤Ð¤ì¡¢»È¤Ã¤Æ¤Ï¤¤¤±¤Þ¤»¤ó¡£ ¤¿¤È¤¨¤Ð¡¢¥¦¥§¥Ö¥Ú¡¼¥¸¤ò¸«¤ë¤È¤¤Ë¥Ö¥é¥¦¥¶¤Ê¤É¤Ç¥µ¡¼¥Ð¡¼¤Ë¥¢¥¯¥»¥¹¤¹¤ë¥×¥í¥È¥³¥ë¤Ç¤¢¤ë HTTP¤Ê¤É¤Ï80È֥ݡ¼¥È¤¬»È¤ï¤ì¤Æ¤ª¤ê¡¢¥µ¡¼¥Ð¥×¥í¥°¥é¥à¤Ç80È֥ݡ¼¥È¤ò»ÈÍѤ·¤Æ¤·¤Þ¤¦¤È ¥¦¥§¥Ö¥Ú¡¼¥¸¤ò±ÜÍ÷¤¹¤ë¤³¤È¤¬¤Ç¤¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¤¤Þ¤¹ ¤è¤Ã¤Æ1025°Ê¾å¤ÎÀ°¿ô¤òPORT¤Ë»ØÄꤷ¤Æ¤¯¤À¤µ¤¤ IP¥¢¥É¥ì¥¹¤Î»ØÄê¤Ë´Ø¤·¤Æ¤Ï¤³¤Î¤Þ¤Þ¤ÎÄ̤ê¤Ç¹½¤¤¤Þ¤»¤ó ¢socket´Ø¿ô¤Ç¥½¥±¥Ã¥È¤òºîÀ®¤·¤Þ¤¹ ¤³¤Î¤È¤Âè2°ú¿ô¤ËSOCK_STREAM¤ò»ØÄꤹ¤ë¤ÈTCP/IPÍѤΥ½¥±¥Ã¥È¤¬ºîÀ®¤µ¤ì¤Þ¤¹ ¤³¤³¤Ç¤Ï»È¤¤¤Þ¤»¤ó¤¬SOCK_DGRAM¤ò»ØÄꤹ¤ë¤ÈUDPÍѤΥ½¥±¥Ã¥È¤¬ºîÀ®¤µ¤ì¤Þ¤¹ £bind´Ø¿ô¤ÇÀè¤Û¤ÉÀßÄꤷ¤¿¥µ¡¼¥Ð¦¤Î¥Ý¡¼¥È¤ÈIP¥¢¥É¥ì¥¹¾ðÊó¤ò¥½¥±¥Ã¥È¤È´ØÏ¢ÉÕ¤±¤Þ¤¹ ¤listen´Ø¿ô¤ÇÂÔ¤Á¼õ¤±¤Î½àÈ÷¤ò¤·¤Þ¤¹¡£ÂèÆó°ú¿ô¤Ï¥Ð¥Ã¥¯¥í¥°¤Î»ØÄê¤Ç¤¹¤¬ÉáÄ̤Ï5¤ò»ØÄꤷ¤Þ¤¹ ¤½¤Î¼¡¤Î½èÍý¤ÏÈó¾ï¤Ë½ÅÍפǤ¹ // ¤³¤³¤Ç¡¢¥Î¥ó¥Ö¥í¥Ã¥¥ó¥°¤ËÀßÄꤷ¤Æ¤¤¤Þ¤¹¡£ // val = 0¤Ç¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¤ËÀßÄê¤Ç¤¤Þ¤¹¡£ // ¥½¥±¥Ã¥È¤Î½é´üÀßÄê¤Ï¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¤Ç¤¹¡£ u_long val=1; ioctlsocket(m_ServerSocket, FIONBIO, &val); ¤³¤Î½èÍý¤ò¤¹¤ëÍýͳ¤Ê¤Î¤Ç¤¹¤¬¡¢ ¥¯¥é¥¤¥¢¥ó¥È¤«¤é¤ÎÀܳ¤ò¹Ô¤¦accept´Ø¿ô¡¢¥Ç¡¼¥¿¤ò¼õ¿®¤¹¤ërecv´Ø¿ô ¥¯¥é¥¤¥¢¥ó¥È¦¤«¤é¥µ¡¼¥Ð¤ËÀܳ¤ò¹Ô¤¦connect´Ø¿ô¡ÊÂèÆó²ó¤ÇÀâÌÀ¤·¤Þ¤¹¡Ë¤Ê¤É¤Ï ÆþÎϤ¬¤¢¤ë¤Þ¤Ç½èÍý¤¬»ß¤Þ¤Ã¤Æ¤·¤Þ¤¦scanf¤Î¤è¤¦¤Ê´Ø¿ô¤Ç¤¹ ¤³¤Î¤è¤¦¤Ê½èÍý¤ò»ß¤á¤Æ¤·¤Þ¤¦´Ø¿ô¤ò¥Ö¥í¥Ã¥¥ó¥°´Ø¿ô¤È¸Æ¤Ó¤Þ¤¹¡£ ¤³¤³¤Ç²¿¤¬¸À¤¤¤¿¤¤¤«¤È¤¤¤¦¤ÈÅÓÃæ¤Ç½èÍý¤¬»ß¤Þ¤Ã¤Æ¤·¤Þ¤¦¤Èº¤¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹ ¤Ä¤Þ¤ê¡¢accept´Ø¿ô¤Ç¥¯¥é¥¤¥¢¥ó¥È¤«¤é¤ÎÀܳ¤ò¤º¤Ã¤ÈÂԤäƤ¤¤ë´Ö¤Ï¡¢ ½èÍý¤¬¤³¤³¤Ç»ß¤Þ¤Ã¤Æ¤·¤Þ¤¤¡¢Â¾¤Î½èÍý¤¬¤Ç¤¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹ ¤³¤ì¤òÂdz«¤¹¤ë¤Ë¤Ï¼¡¤ÎÊýË¡¤¬¤¢¤ê ¡¦¥Þ¥ë¥Á¥¹¥ì¥Ã¥É²½¤¹¤ë ¡¦¥½¥±¥Ã¥È½èÍý¤ò¥¦¥£¥ó¥É¥¦¥á¥Ã¥»¡¼¥¸²½¤¹¤ë ¡¦¥½¥±¥Ã¥È¤ò¥Î¥ó¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¡ÊÈóƱ´ü¥½¥±¥Ã¥È¡Ë¤Ë¤¹¤ë ¥Þ¥ë¥Á¥¹¥ì¥Ã¥É²½¤Ë¤Ä¤¤¤Æ¤Ï½èÍý¤¬Èó¾ï¤ËÊ£»¨¤Ç¿§¡¹¤ÈÀ©¸æ¤¬¤á¤ó¤É¤¦¤¯¤µ¤¤ÌäÂ꤬½Ð¤Æ¤¯¤ë¤Î¤Ç°·¤¤¤Þ¤»¤ó ¥¦¥£¥ó¥É¥¦¥á¥Ã¥»¡¼¥¸²½¤¹¤ë½èÍý¤â¥¦¥£¥ó¥É¥¦¥º¥×¥í¥°¥é¥ß¥ó¥°¸ÂÄê¤Î½èÍý¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¤Î¤Çº£²ó¤Ï°·¤¤¤Þ¤»¤ó ¤³¤³¤Ç¤Ï¡¢¥½¥±¥Ã¥È¤òioctlsocket´Ø¿ô¤òÍѤ¤¤Æ¥Î¥ó¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¡ÊÈóƱ´ü¥½¥±¥Ã¥È¡Ë¤Ë¤·¤Þ¤¹ ÈóƱ´ü¥½¥±¥Ã¥È¤Ë¤·¤Æ¤ª¤±¤Ð¡¢accept´Ø¿ô¤ärecv´Ø¿ô¤Ç½èÍý¤¬»ß¤Þ¤Ã¤Æ¤·¤Þ¤¦¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó ¤³¤Î¤¤¤º¤ì¤«¤Î½èÍý¤ÏÊ£¿ô¤Î¥¯¥é¥¤¥¢¥ó¥È¤«¤é¤ÎÀܳ¤ËÂбþ¤¹¤ë¤¿¤á¤Ë¤Ïɬ¿Ü¤Î½èÍý¤Ç¤¹ ---------- ÈóƱ´ü¥½¥±¥Ã¥È²½¸å¥¤ò¹Ô¤¤¤Þ¤¹¡ÊAccept¥á¥½¥Ã¥É¡Ë bool CServer::Accept(SOCKET* pDstSocket,struct sockaddr_in* pDstAddr) { // ¥¯¥é¥¤¥¢¥ó¥È¥¢¥É¥ì¥¹ int dstAddrSize = sizeof(struct sockaddr_in); *pDstSocket = accept(m_ServerSocket, (struct sockaddr *) pDstAddr, &dstAddrSize); if(*pDstSocket != INVALID_SOCKET){ // Àܳ¥½¥±¥Ã¥È¤òÈóƱ´ü¥â¡¼¥É¤Ë¤¹¤ë u_long val=1; ioctlsocket(*pDstSocket, FIONBIO, &val); return true; } return false; } ¥accept´Ø¿ô¤Ç¥¯¥é¥¤¥¢¥ó¥È¤«¤é¤ÎÀܳ¤òÂÔ¤Á¤Þ¤¹ ¤³¤Î´Ø¿ô¤ÏÂèÆó²ó¤ÇÀâÌÀ¤¹¤ë¡¢¥¯¥é¥¤¥¢¥ó¥È¦¤Îconnect´Ø¿ô¤ÈÂбþ¤·¤Æ¤¤¤Þ¤¹ ¥µ¡¼¥Ð¦¤¬accept¾õÂ֤ǥ¯¥é¥¤¥¢¥ó¥È¦¤Çconnect´Ø¿ô¤¬¸Æ¤Ð¤ì¤ë¤ÈÀܳ¤¬´°Î»¤·¤Þ¤¹ *pDstSocket = accept(m_ServerSocket, (struct sockaddr *) pDstAddr, &dstAddrSize); accept´Ø¿ô¤ÎÂè°ì°ú¿ô¤Ë¤Ï¤¤Î¥½¥±¥Ã¥È¤ò»ØÄꤷ¤Þ¤¹ Àܳ¤¬À®¸ù¤¹¤ë¤ÈÌá¤êÃͤËÀܳÀè¤Î¥½¥±¥Ã¥È¤¬ÊÖ¤ê¤Þ¤¹ °Ê¹ß¡¢ÀܳÀè¤Î¥¯¥é¥¤¥¢¥ó¥È¤È¤Î¥Ç¡¼¥¿Á÷¼õ¿®¡Êrecv´Ø¿ô¡¢send´Ø¿ô¡Ë¤ò¹Ô¤¦¤Ë¤Ï¤³¤Î¥½¥±¥Ã¥È¤ò»È¤¤¤Þ¤¹ ¤Þ¤¿¡¢accept´Ø¿ô¤ÎÂèÆó°ú¿ô¤ÇÀܳÀè¤Î¥¯¥é¥¤¥¢¥ó¥È¤Î¥¢¥É¥ì¥¹¾ðÊ󤬼èÆÀ¤Ç¤¤Þ¤¹ // Àܳ¥½¥±¥Ã¥È¤òÈóƱ´ü¥â¡¼¥É¤Ë¤¹¤ë u_long val=1; ioctlsocket(*pDstSocket, FIONBIO, &val); recv´Ø¿ô¤¬¥Ö¥í¥Ã¥¥ó¥°´Ø¿ô¤Ê¤Î¤Ç¡¢¥Ç¡¼¥¿Á÷¼õ¿®ÍÑ¥½¥±¥Ã¥È¤òÈóƱ´ü¥½¥±¥Ã¥È²½¤·¤Þ¤¹ --------- ¦¤Ç¤¹¡ÊRecv¥á¥½¥Ã¥É¡¢Send¥á¥½¥Ã¥É¡Ë ¥Ç¡¼¥¿¤Î¼õ¿®¤Ë¤Ïrecv´Ø¿ô¡¢¥Ç¡¼¥¿¤ÎÁ÷¿®¤Ë¤Ïsend´Ø¿ô¤ò»È¤¤¤Þ¤¹ // ¼õ¿® RECVSTATUS CServer::Recv(SOCKET DstSocket,char* pData,int DataSize,int *pRecvSize) { int n = recv(DstSocket, pData, DataSize, 0); if (n < 1) { // ¥Ç¡¼¥¿¤¬Íè¤Æ¤¤¤Ê¤¤ if (WSAGetLastError() == WSAEWOULDBLOCK) { return RECV_STILL; // ÀÚÃÇor¥¨¥é¡¼ } else { return RECV_FAILED; } } *pRecvSize = n; // ¼õ¿®¥Ç¡¼¥¿Ä¹¼èÆÀ return RECV_SUCCESSED; } ¥Ç¡¼¥¿¼õ¿®½èÍý¤Ç¤¹ int n = recv(DstSocket, pData, DataSize, 0); recv´Ø¿ô¤ÎÂè°ì°ú¿ô¤Ë¤Ï¡¢ÀܳºÑ¤ß¥½¥±¥Ã¥È¤ò»ØÄꤷ¤Þ¤¹ ÂèÆó°ú¿ô¤Ë¤Ï¼õ¤±¼è¤ë¥Ç¡¼¥¿ÍÑÇÛÎó¤ÈÂè»°°ú¿ô¤Ë¤Ï¥Ç¡¼¥¿ÇÛÎó¥µ¥¤¥º¤ò»ØÄꤷ¤Þ¤¹ µ¤¤òÉÕ¤±¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤Î¤¬Ìá¤êÃͤǤ¹ ´Ø¿ô¤¬À®¸ù¤¹¤ì¤Ð¡¢¼ÂºÝ¤Ë¼èÆÀ¤·¤¿¥Ç¡¼¥¿¤Î¥Ç¡¼¥¿Ä¹¡Êsend¤ÇÁ÷¤é¤ì¤¿¥Ç¡¼¥¿Ä¹¡Ë¤¬ÊÖ¤ê¤Þ¤¹ ÀÚÃÇ»þ¤Ï0¡¢¥¨¥é¡¼»þ¤ÏSOCKET_ERROR(-1)¤¬ÊÖ¤ê¤Þ¤¹ ¤Þ¤¿¡¢ÈóƱ´ü¥½¥±¥Ã¥È»þ¤Ï¥Ç¡¼¥¿¤¬Á÷¤é¤ì¤Æ¤¤Æ¤Ê¤¤¾ì¹ç WSAGetLastError()¤¬WSAEWOULDBLOCK¤È¤Ê¤ë¤Î¤Ç¥Á¥§¥Ã¥¯¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹ RECVSTATUS¤ÏServer.h¤Ç»ä¤¬ÄêµÁ¤·¤¿ÎóµóÂΤǤ¹ // Server.h // ¼õ¿®¾õÂÖ enum RECVSTATUS { RECV_STILL, // ¥Ç¡¼¥¿¤¬Íè¤Æ¤¤¤Ê¤¤ RECV_SUCCESSED, // À®¸ù RECV_FAILED // ÀÚÃÇor¥¨¥é¡¼ }; ¼õ¿®¾õÂ֤˹ç¤ï¤»¤ÆÌá¤êÃͤòÊѤ¨¤Þ¤¹ ³¤¤¤ÆÁ÷¿®½èÍý¤Ç¤¹ // Á÷¿® bool CServer::Send(SOCKET DstSocket,char* pData,int DataSize) { // ¥Ñ¥±¥Ã¥È¤ÎÁ÷¿® if(send(DstSocket, pData, DataSize, 0) == SOCKET_ERROR) return false; return true; } ¥Ç¡¼¥¿Á÷¿®½èÍý¤Ç¤¹ send(DstSocket, pData, DataSize, 0); »È¤¤·¿¤ÏÂèÆó°ú¿ô¤Ë¥Ç¡¼¥¿¡¢Âè»°°ú¿ô¤Ë¥Ç¡¼¥¿¥µ¥¤¥º¤ò»ØÄꤷ¤Þ¤¹ Á÷¿®¼ºÇÔ»þ¤ÏÌá¤êÃͤ¬SOCKET_ERROR¤òÊÖ¤·¤Þ¤¹¡£ Àܳ¤¬³ÎΩ¤·¤¿¸å¤Ï ¦¤ò·«¤êÊÖ¤·¤Æ¿§¡¹½èÍý¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹ Á÷¿®¤¹¤ë¥Ç¡¼¥¿¤Ë´Ø¤·¤Æ¤Ï¤¢¤é¤«¤¸¤á¥µ¡¼¥Ð¡¼¥¯¥é¥¤¥¢¥ó¥È´Ö¤Ç ¼è¤ê·è¤á¤ò¤·¤Æ¤ª¤«¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó º£²ó¤ÏPacket.h¶¦Ḁ̈إåÀ¡¼¤ò ¥µ¡¼¥Ð¥×¥í¥°¥é¥à¡¢¥¯¥é¥¤¥¢¥ó¥È¥×¥í¥°¥é¥à¤È¤â¤Ë ¥¤¥ó¥¯¥ë¡¼¥É¤·¤Æ¤¤¤Þ¤¹ -------- §¤Ç¤¹(Close¥á¥½¥Ã¥É) ¥¯¥é¥¤¥¢¥ó¥È¤«¤é¤ÎÀܳ¤¬Àڤ줿¾ì¹ç¡Ê¤¢¤ë¤¤¤ÏÀܳ¤òÀÚ¤ë¾ì¹ç¡Ë closesocket´Ø¿ô¤Ç¥Ç¡¼¥¿Á÷¼õ¿®ÍÑ¥½¥±¥Ã¥È¤ò»ØÄꤷ¤Þ¤¹ // ÀÚÃÇ void CServer::Close(SOCKET DstSocket) { closesocket(DstSocket); } ¥µ¥ó¥×¥ë¤Ç¤Ïrecv´Ø¿ô¤Ç¥¯¥é¥¤¥¢¥ó¥È¤«¤é¤ÎÀܳ¤¬Àڤ줿»þ¡¢¸Æ¤Ó½Ð¤·¤Æ¥½¥±¥Ã¥È¤Î¸å½èÍý¤ò¤·¤Æ¤¤¤Þ¤¹ --------- ¨¤Ç¤¹¡Ê¥Ç¥¹¥È¥é¥¯¥¿¡Ë WinSock¥é¥¤¥Ö¥é¥ê¤Î¸å½èÍý¤ò¤·¤Þ¤¹ // ¥Ç¥¹¥È¥é¥¯¥¿ CServer::~CServer() { // Windows ¤Ç¤Î½ªÎ»ÀßÄê WSACleanup(); } --------- ¥µ¡¼¥Ð¦¤Ï°Ê¾å¤Ç¤¹ µ¯Æ°¤Ë¤Ï¥¯¥é¥¤¥¢¥ó¥È¤Î¥×¥í¥°¥é¥à¤âɬÍפˤʤê¤Þ¤¹ C/C++¥½¥±¥Ã¥È¥×¥í¥°¥é¥ß¥ó¥°ÂèÆó²ó #vote(¡Ê¡°¦Ø¡°¡Ë¤Ç¤¤¿¡¼[53],¡£¡Ê`¦Ø¡#¡Ë¡£¤Ç¤¤Í¡¼[53])