¡¡¡¡
ؼ×èÈûÄ£Ðͼò½é
²»ÖªµÀ´ó¼ÒÓÐûÓÐ×¢Òâµ½.ÎÒÃǿͻ§¶Ë »òÕß·þÎñ¶Ë.µÄTCP ÊÕ·¢Êý¾ÝµÄʱºò(send/recv)Èç¹û½ÓÊܲ»µ½Êý¾Ý¾ÍÒ»Ö±²»·µ»Ø.´Ó¶øÔì³ÉÎÒÃÇÍøÂçµÄ×èÈû.³ÌÐòÎÞ·¨Õý³£Ö´ÐÐ.
²»¹ýÕë¶ÔÕâÒ»·½·¨.ÎÒÃÇ¿ÉÒÔ¿ªÒ»¸öÏß³ÌȥרÃŽÓÊÜÊý¾Ý.»òÕß·¢ËÍÊý¾Ý.
Õâ¸ö¾ÍÊÇÎÒÃdz£ËµµÄ×èÈû.
Ö»ÒªÎÒÃÇ´´½¨µÄÌ×½Ó×Ö¶¼ÊÇ×èÈûÄ£ÐÍ. ¾ÍÊÇ˵Êý¾Ý½ÓÊܲ»µ½²»·µ»Ø.
ÎÒÃÇ¿ÉÒÔÉèÖÃΪ·Ç×èÈû.¾ÍÊDz»¹ÜÊý¾ÝÓÐûÓÐÀ´µ½¶¼»á·µ»Ø.Èç¹ûÀ´µ½.»áÓÐ֪ͨ.ÎÒÃÇ¿ÉÒÔ±à³Ì½ÓÊÜÊý¾Ý.
ÉèÖ÷Ç×èÈûģʽ·½·¨
ioctlsocket(SOCKET s, long cmd, u_long *arpg);
¸Ä±äÌ×½Ó×Öģʽ.Ϊ·É×âshe.
¶þؼ×èÈûģʽµü´úģʽ Óë ²¢·¢Á¬½Óģʽ
1.×èÈûģʽµÄµü´úģʽ ¾ÍÊÇָÿ´ÎÖ»·þÎñÒ»¸öÁ¬½Ó.Ö»ÓзþÎñÍ굱ǰµÄ¿Í»§¶ËÁ¬½ÓÖ®ºó.²Å»á¼ÌÐø·þÎñÏÂÒ»¸ö¿Í»§Á¬½Ó
2.²¢·¢Á¬½Óģʽ ͨ¹ý¶àÏß³Ì.¿ÉÒÔͬʱ·þÎñ¶à¸öÁ´½Ó.ûһ¸öÏ̴߳¦ÀíÒ»¸ö¿Í»§¶ËµÄÁ¬½Ó.
×èÈûµü´úģʽ²½Öè
1.Éú³ÉÒ»¸öº¯Êý.°ó¶¨±¾µØµØÖ·¸ú¼àÌý.
2.Éú³ÉÒ»¸öº¯Êý.רÃŽÓÊÜÒ»¸ö¿Í»§¶ËÁ¬½Ó.²¢ÇÒ·µ»Ø¶ÔÓ¦Á¬½ÓµÄÌ×½Ó×Ö.
3.´¦Àíûһ¸ö¿Í»§¶ËµÄÁ¬½Ó.ʵÏÖ½ÓÊܸú·¢ËÍÊý¾Ý.
4.¹Ø±ÕÒ»¸öÁ¬½Ó.
Æäʵ¾ÍÊǽ²´´½¨·þÎñ¶ËÍøÂç×öÁËÒ»¸ö·â×°.
ÈçÏ´úÂë. Ò»¸ö.hÎļþ.´æ·Åº¯ÊýÉùÃ÷.Ò»¸ö.cpp·â×°ÁËÍøÂçÁ¬½ÓµÄ´úÂë.
.hÎļþ:
¸´ÖÆ´úÂë
#pragma once #include "stdafx.h" #include #include #pragma comment(lib,"ws2_32.lib") using namespace std;
#include "initSocket.h" void DebugLog(TCHAR *str); //³õʼ»¯Êý¾Ý int initSocket(); //1.´´½¨Ì×½Ó×Ö.°ó¶¨µØÖ·,¿ªÊ¼¼àÌý SOCKET BindAnListen(int nBacklog); //½ÓÊÜÁ¬½Ó·Ö×° SOCKET AccepeConnect(SOCKET hSocket); //½ÓÊܸú·¢ËÍÊý¾Ý BOOL ClientReadAnWriteData(SOCKET hSocket); //¹Ø±ÕÊý¾ÝÁ¬½Ó BOOL ColseConnect(SOCKET hSocket);
¸´ÖÆ´úÂë
.cppʵÏÖ.
¸´ÖÆ´úÂë
#include "initSocket.h" void DebugLog(TCHAR *str)
{
cout << str << WSAGetLastError() << endl;
} //³õʼ»¯Êý¾Ý int initSocket()
{
WSADATA data; if (WSAStartup(MAKEWORD(2, 2), &data))
{
DebugLog(TEXT("initsocket faile")); return 0;
}
} //1.´´½¨Ì×½Ó×Ö.°ó¶¨µØÖ·,¿ªÊ¼¼àÌý SOCKET BindAnListen(int nBacklog)
{ //´´½¨Ì×½Ó×Ö BOOL bRet = FALSE;
SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == hSocket)
{
DebugLog(TEXT("BindAnListen Fail")); return INVALID_SOCKET;
} //°ó¶¨Ì×½Ó×Ö sockaddr_in addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //htonl addr_any addr.sin_family = AF_INET;
addr.sin_port = htons(8524);
bRet = bind(hSocket, (sockaddr *)&addr, sizeof(addr)); if (SOCKET_ERROR == bRet)
{
DebugLog(TEXT("bind fail"));
closesocket(hSocket);
WSACleanup(); return INVALID_SOCKET;
} //¼àÌýÌ×½Ó×Ö bRet = FALSE;
bRet = listen(hSocket, nBacklog); if (SOCKET_ERROR ==bRet)
{
DebugLog(TEXT("Listen fail"));
closesocket(hSocket);
WSACleanup(); return INVALID_SOCKET;
} return hSocket;
} //½ÓÊÜÁ¬½Ó·Ö×° SOCKET AccepeConnect(SOCKET hSocket)
{
sockaddr_in addr; int nSize = sizeof(addr);
SOCKET hNewSocket = accept(hSocket, (LPSOCKADDR)&addr, &nSize); if (hNewSocket == INVALID_SOCKET)
{
DebugLog(TEXT("Accept An Connect Fail")); return INVALID_SOCKET;
} return hNewSocket;
} //½ÓÊܸú·¢ËÍÊý¾Ý BOOL ClientReadAnWriteData(SOCKET hSocket)
{ char szBuffer[1024] = { NULL }; int nBufferSzie = sizeof(szBuffer); //Ñ»·´¦ÀíÊý¾Ý int nRecvBytes = 0; do {
nRecvBytes = recv(hSocket,szBuffer, nBufferSzie, 0); if (SOCKET_ERROR == nRecvBytes)
{
DebugLog(TEXT("Recv Data Fail")); return FALSE;
} else if (0 != nRecvBytes)
{
¡¡¡¡¡¡¡¡¡¡¡¡¡¡szBuffer[nRecvBytes] = 0; ¡¡¡¡¡¡¡¡
cout << "½ÓÊܵ½µÄÊý¾ÝΪ: " << szBuffer << endl; //½Ó×ÅÑ»··¢ËÍ»ØÈ¥. int nSendDataBytes = 0; while (nSendDataBytes < nRecvBytes)
{ int nRetValue = send(hSocket, szBuffer, nBufferSzie, 0); if (nRetValue > 0)
{
nSendDataBytes = nSendDataBytes + nRetValue; //ÿ´Î·¢Ë͵ÄÊý¾Ý¶¼Ôö¼Ó.ÕâÑù¾Í»á·¢Ë͹ýÈ¥ÁË } else if (nRetValue == SOCKET_ERROR)
{
DebugLog(TEXT("·¢ËÍÊý¾Ýʧ°Ü")); return FALSE;
} else { //send ·µ»Ø0 Ò²¾ÍÊÇsendʧ°ÜÁË.¿Í»§¶Ë¹Ø±ÕÁË DebugLog(TEXT("·¢ËÍÊý¾Ýʧ°Ü,¿Í»§¶ËÒѾ¹Ø±ÕÁË")); return FALSE;
}
}
}
} while (0 != nRecvBytes); return FALSE;
}
BOOL ColseConnect(SOCKET hSocket)
{ //shutdown ¸ú closesocketÒ»Ñù.²»¹ý TCP »á·¢ËÍÒ»¸öFIN·Ö¶Î.¸ø¶Ô·½±íÃûÒѾÍê³ÉÊý¾Ý·¢ËÍ if (shutdown(hSocket,SD_SEND) == SOCKET_ERROR)
{
DebugLog(TEXT("¹Ø±ÕÁ¬½Óʧ°Ü")); return FALSE;
} //×¢Òâ.¿Í»§¶Ë»á·¢ËÍÒ»¸öÊý¾Ý.²»Ð´Ò²¿ÉÒÔ. return TRUE;
}
¸´ÖÆ´úÂë
ÉÏÃæµÄ´úÂëÖ»ÊǰÑÎÒÃÇÍøÂç´´½¨µÄһЩ²½Öè¸ø·â×°ÁË.²¢Ã»ÓÐʵ¼Ê±àдÎÒÃÇÓõĴúÂë.
ÔÚmainº¯ÊýÖÐʹÓÃ.Ö»·þÎñÒ»¸ösocket²Ù×÷
¸´ÖÆ´úÂë
// Server.cpp : ¶¨Òå¿ØÖÆÌ¨Ó¦ÓóÌÐòµÄÈë¿Úµã¡£ // #include "initSocket.h" int main()
{ //³õʼ»¯ initSocket(); //1.°ó¶¨²¢ÇÒ¼àÌý SOCKET hSocket = BindAnListen(1); if (INVALID_SOCKET == hSocket)
{
DebugLog(TEXT("main Bind Fail")); goto Opt;
} // 2.Ñ»·½ÓÊÜÌ×½Ó×ÖÁ¬½Ó while (true) //Ö÷Òª´úÂëÊÇÕâÀï.
{ //½ÓÊܿͻ§¶ËÁ¬½Ó SOCKET hRetSocket = AccepeConnect(hSocket); if (INVALID_SOCKET == hRetSocket)
{
DebugLog(TEXT("main accept Fail")); break;
} //¶ÁÈ¡Êý¾Ý. if (FALSE == ClientReadAnWriteData(hRetSocket))
{ //Ö»·þÎñÒ»¸ösocket.¶ÔÆä½øÐжÁȡдÈë²Ù×÷.È»ºóÏ·½½øÐйرÕ. break;
} if (ColseConnect(hRetSocket))
{ break;
}
}
Opt:
getchar(); //µÈ´ýÒ»ÏÂ.¹Û¿´´íÎóÄÚÈÝ ColseConnect(hSocket); return 0;
}