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(¡Ê¡°¦Ø¡°¡Ë¤Ç¤­¤¿¡¼[74],¡£¡Ê`¦Ø¡­#¡Ë¡£¤Ç¤­¤Í¡¼[84])
|¡Ê¡°¦Ø¡°¡Ë¤Ç¤­¤¿¡¼|74|
|¡£¡Ê`¦Ø¡­#¡Ë¡£¤Ç¤­¤Í¡¼|84|



¥È¥Ã¥×   ÊÔ½¸ º¹Ê¬ ¥Ð¥Ã¥¯¥¢¥Ã¥× źÉÕ Ê£À½ ̾Á°Êѹ¹ ¥ê¥í¡¼¥É   ¿·µ¬ °ìÍ÷ ñ¸ì¸¡º÷ ºÇ½ª¹¹¿·   ¥Ø¥ë¥×   ºÇ½ª¹¹¿·¤ÎRSS