多线程socket通信server

来源:互联网 发布:淘宝开店快递费用 编辑:程序博客网 时间:2024/05/19 17:59
控制台下实现多线程socket通信,服务端为每个请求的客户端创建一个线程,进行通信。其实这些MSDN里都有。

一.基本流程如下:
定义变量->获得winsock版本->加载winsock库->初始化->创建套接字->设置套接字选项->关闭套接字->卸载winsock库->释放资源

二.客户端 建立过程(上篇是客户端)

服务器                        

1   初始化WSA                      
2   建立一个SOCKET               
3   绑定SOCKET                     
4   在指定的端口监听               
5   接受一个连接                   
6   发送和接受数据 
7   断开连接 

三.注意winsock下编程有用到两个库
Winsock2.h

ws2_32.lib 

[cpp] view plaincopy
  1. #include <Winsock2.h>  
  2. #include <stdio.h>  
  3. #include <process.h>  
  4.   
  5. #pragma comment(lib,"ws2_32.lib")  
  6.    
  7. unsigned __stdcall ExecuteThread(void* lparam)   
  8. {   
  9.     SOCKET ClientSocket=(SOCKET)(void*)lparam;   
  10.   
  11.     char sendText[]="make a connection!\r\n";   
  12.     send(ClientSocket, sendText, strlen(sendText)+1, 0 );  
  13.   
  14.     char recvText[100] = {0};  
  15.     if (recv(ClientSocket, recvText, 100, 0) != SOCKET_ERROR)  
  16.     {  
  17.         printf("receive text: %s\n", recvText);  
  18.     }     
  19.   
  20.     _endthreadex(0);  
  21.     return 0;   
  22. }   
  23.   
  24. int main(int argc, char* argv[])  
  25. {  
  26.     // (1)加载套接字库  
  27.     WORD wVersionRequested;         //WinSock库的版本号  
  28.     WSADATA wsaData;  
  29.     int iResult = 0;  
  30.   
  31.     wVersionRequested = MAKEWORD(1, 1);  
  32.     iResult = WSAStartup(wVersionRequested, &wsaData);  
  33.     if( iResult != NO_ERROR)  
  34.     {  
  35.         printf("WSAStartup() failed with error: %d\n", iResult);  
  36.         return -1 ;  
  37.     }  
  38.   
  39.     if( LOBYTE( wsaData.wVersion) != 1 || HIBYTE( wsaData.wVersion) !=1 )  
  40.     {  
  41.         WSACleanup();  
  42.         return -1;  
  43.     }  
  44.     // (2)创建用于监听的套接字  
  45.     SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);  
  46.     if (sockSrv == INVALID_SOCKET)   
  47.     {  
  48.         printf("socket function failed with error: %ld\n", WSAGetLastError());  
  49.         WSACleanup();  
  50.         return -1;  
  51.     }  
  52.   
  53.     SOCKADDR_IN addrSrv;  
  54.     addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
  55.     addrSrv.sin_family = AF_INET;  
  56.     addrSrv.sin_port = htons(51555);  
  57.   
  58.     // (3)绑定套接字  
  59.     iResult = bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));  
  60.     if (iResult == SOCKET_ERROR)   
  61.     {  
  62.         printf("bind function failed with error %d\n", WSAGetLastError());  
  63.   
  64.         iResult = closesocket(sockSrv);  
  65.         if (iResult == SOCKET_ERROR)  
  66.         {  
  67.             printf("closesocket function failed with error %d\n", WSAGetLastError());  
  68.         }  
  69.   
  70.         WSACleanup();  
  71.         return -1;  
  72.     }  
  73.   
  74.     // (4)将套接字设为监听模式,准备接受客户请求  
  75.     iResult = listen(sockSrv, SOMAXCONN);  
  76.     if (iResult == SOCKET_ERROR)  
  77.     {  
  78.         printf("listen function failed with error: %d\n", WSAGetLastError());  
  79.     }  
  80.        
  81.      printf("Listening on socket...\n");  
  82.   
  83.     // (5)创建线程等待客户请求  
  84.     SOCKADDR_IN addrClient;  
  85.     int len = sizeof(SOCKADDR);  
  86.       
  87.     SOCKET sockConn;  
  88.     unsigned dwThreadId;   
  89.     HANDLE hThread;   
  90.   
  91.     while(1)  
  92.     {  
  93.         //等待客户请求  
  94.         sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);  
  95.         if (sockConn == INVALID_SOCKET )  
  96.         {  
  97.             printf("accept function failed with error: %d\n", WSAGetLastError());  
  98.         }  
  99.   
  100.         // _beginthreadx比createthread更安全  
  101.         hThread = (HANDLE)_beginthreadex(NULL, 0, &ExecuteThread, (void*)sockConn, 0, &dwThreadId );  
  102.   
  103.         WaitForSingleObject(hThread, INFINITE );  
  104.     }  
  105.       
  106.     // (6)结束处理  
  107.     CloseHandle(hThread);  
  108.   
  109.     iResult = closesocket(sockConn);  
  110.     if (iResult == SOCKET_ERROR)   
  111.     {  
  112.         printf("closesocket function failed with error %d\n", WSAGetLastError());  
  113.         WSACleanup();  
  114.         return -1;  
  115.     }  
  116.   
  117.     WSACleanup();  
  118.   
  119.     return 0;  
  120. }  
0 0
原创粉丝点击