Windows¤ÇC/C++¤Ç¥Í¥Ã¥È¥ï¡¼¥¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¤ò¤ä¤Ã¤Æ¤ß¤è¤¦¤È»×¤¤¤Þ¤¹ Àè¤Ë»²¹Í¤Ë¤Ê¤ë¥µ¥¤¥È¤È½ñÀÒ¤òµó¤²¤ÆÃÖ¤¤Þ¤¹ Geek¤Ê¥Ú¡¼¥¸ http://www.geekpage.jp/programming/winsock/ ½ñÀÒ¡§ ǤǤâ¤ï¤«¤ë¥Í¥Ã¥È¥ï¡¼¥¯¥×¥í¥°¥é¥ß¥ó¥° WinSock2¥×¥í¥°¥é¥ß¥ó¥° ²þÄûÂ裲ÈÇ¡ÊÀäÈǤʤΤǥ¢¥Þ¥¾¥ó¤È¤«¤ÇÇ㤦¤·¤«¤Ê¤¤¤«¤â¡¦¡¦¡¦¤Ç¤â¹â¤¤¡Ë Àè¤ËÂè°ì²ó¤ÈÂèÆó²ó¤Ç»È¤¦¥µ¡¼¥Ð¡¼¤È¥¯¥é¥¤¥¢¥ó¥È¤Î¥×¥í¥°¥é¥à¤òµó¤²¤ÆÃÖ¤¤Þ¤¹ Àµ¤·¤¯Æ°ºî¤µ¤»¤ë¤Ë¤Ï¥µ¡¼¥Ð¦¥×¥í¥°¥é¥à¤òµ¯Æ°¤µ¤»¤Æ¤«¤é ¥µ¡¼¥Ð¥×¥í¥°¥é¥à¤òµ¯Æ°¤µ¤»¡¢ ¥µ¡¼¥Ð¡¼¥×¥í¥°¥é¥à¤Î¼ê½ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹ ¡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¤Î¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó»ØÄê¤ò¤·¤Þ¤¹ ¤Ä¤®¤Ë¢¡Á¤¤ò°ìµ¤¤Ë¤ä¤ê¤Þ¤¹(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¥¢¥É¥ì¥¹¤ò»ØÄꤷ¤Þ¤¹ ¢socket´Ø¿ô¤Ç¥½¥±¥Ã¥È¤òºîÀ®¤·¤Þ¤¹ £bind´Ø¿ô¤ÇÀè¤Û¤ÉÀßÄꤷ¤¿¥µ¡¼¥Ð¦¤Î¥Ý¡¼¥È¤ÈIP¥¢¥É¥ì¥¹¾ðÊó¤ò¥½¥±¥Ã¥È¤È´ØÏ¢ÉÕ¤±¤Þ¤¹ ¤½¤Î¼¡¤Î½èÍý¤ÏÈó¾ï¤Ë½ÅÍפǤ¹ // ¤³¤³¤Ç¡¢¥Î¥ó¥Ö¥í¥Ã¥¥ó¥°¤ËÀßÄꤷ¤Æ¤¤¤Þ¤¹¡£ // val = 0¤Ç¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¤ËÀßÄê¤Ç¤¤Þ¤¹¡£ // ¥½¥±¥Ã¥È¤Î½é´üÀßÄê¤Ï¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¤Ç¤¹¡£ u_long val=1; ioctlsocket(m_ServerSocket, FIONBIO, &val); ¤³¤Î½èÍý¤ò¤¹¤ëÍýͳ¤Ê¤Î¤Ç¤¹¤¬¡¢ ¡¦¥Þ¥ë¥Á¥¹¥ì¥Ã¥É²½¤¹¤ë ¡¦¥½¥±¥Ã¥È½èÍý¤ò¥¦¥£¥ó¥É¥¦¥á¥Ã¥»¡¼¥¸²½¤¹¤ë ¡¦¥½¥±¥Ã¥È¤ò¥Î¥ó¥Ö¥í¥Ã¥¥ó¥°¥â¡¼¥É¡ÊÈóƱ´ü¥½¥±¥Ã¥È¡Ë¤Ë¤¹¤ë ¥Þ¥ë¥Á¥¹¥ì¥Ã¥É²½¤Ë¤Ä¤¤¤Æ¤Ï½èÍý¤¬Èó¾ï¤ËÊ£»¨¤Ç¿§¡¹¤ÈÀ©¸æ¤¬¤á¤ó¤É¤¦¤¯¤µ¤¤ÌäÂ꤬½Ð¤Æ¤¯¤ë¤Î¤Ç°·¤¤¤Þ¤»¤ó ÈóƱ´ü¥½¥±¥Ã¥È²½¸å¥¤ò¹Ô¤¤¤Þ¤¹¡Ê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´Ø¿ô¤Ç¥¯¥é¥¤¥¢¥ó¥È¤«¤é¤ÎÀܳ¤òÂÔ¤Á¤Þ¤¹ *pDstSocket = accept(m_ServerSocket, (struct sockaddr *) pDstAddr, &dstAddrSize); accept´Ø¿ô¤ÎÂè°ì°ú¿ô¤Ë¤Ï¤¤Î¥½¥±¥Ã¥È¤ò»ØÄꤷ¤Þ¤¹ // Àܳ¥½¥±¥Ã¥È¤òÈóƱ´ü¥â¡¼¥É¤Ë¤¹¤ë u_long val=1; ioctlsocket(*pDstSocket, FIONBIO, &val); recv´Ø¿ô¤¬¥Ö¥í¥Ã¥¥ó¥°´Ø¿ô¤Ê¤Î¤Ç¡¢¥Ç¡¼¥¿Á÷¼õ¿®ÍÑ¥½¥±¥Ã¥È¤òÈóƱ´ü¥½¥±¥Ã¥È²½¤·¤Þ¤¹ ¦¤Ç¤¹¡Ê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´Ø¿ô¤ÎÂè°ì°ú¿ô¤Ë¤Ï¡¢ÀܳºÑ¤ß¥½¥±¥Ã¥È¤ò»ØÄꤷ¤Þ¤¹ // 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); »È¤¤·¿¤ÏÂèÆó°ú¿ô¤Ë¥Ç¡¼¥¿¡¢Âè»°°ú¿ô¤Ë¥Ç¡¼¥¿¥µ¥¤¥º¤ò»ØÄꤷ¤Þ¤¹ Àܳ¤¬³ÎΩ¤·¤¿¸å¤Ï Á÷¿®¤¹¤ë¥Ç¡¼¥¿¤Ë´Ø¤·¤Æ¤Ï¤¢¤é¤«¤¸¤á¥µ¡¼¥Ð¡¼¥¯¥é¥¤¥¢¥ó¥È´Ö¤Ç §¤Ç¤¹(Close¥á¥½¥Ã¥É) // ÀÚÃÇ void CServer::Close(SOCKET DstSocket) { closesocket(DstSocket); } ¥µ¥ó¥×¥ë¤Ç¤Ïrecv´Ø¿ô¤Ç¥¯¥é¥¤¥¢¥ó¥È¤«¤é¤ÎÀܳ¤¬Àڤ줿»þ¡¢¸Æ¤Ó½Ð¤·¤Æ¥½¥±¥Ã¥È¤Î¸å½èÍý¤ò¤·¤Æ¤¤¤Þ¤¹ ¨¤Ç¤¹¡Ê¥Ç¥¹¥È¥é¥¯¥¿¡Ë // ¥Ç¥¹¥È¥é¥¯¥¿ CServer::~CServer() { // Windows ¤Ç¤Î½ªÎ»ÀßÄê WSACleanup(); } ¥µ¡¼¥Ð¦¤Ï°Ê¾å¤Ç¤¹
|