多线程Socket服务端处理程序

简介:

 

 
  1. #include <WinSock2.h>  
  2. #include <WS2tcpip.h>  
  3. #include <windows.h>  
  4. #include <stdio.h>  
  5.  
  6. #pragma comment(lib,"ws2_32.lib")  
  7. #define DEFAULT_PORT "100000"  
  8. #define BUF_SIZE 4096  
  9. #define MAX_REQUEST 1024  
  10.  
  11. DWORD WINAPI CommunicationThread(LPVOID lpParameter){  
  12.     DWORD dwTid = GetCurrentThreadId();  
  13.     SOCKET socket = (SOCKET)lpParameter;  
  14.     LPSTR szRequest = (LPSTR)HeapAlloc(GetProcessHeap(),0,MAX_REQUEST);  
  15.     int iResult;  
  16.     int bytesSent;  
  17.     iResult = recv(socket,szRequest,MAX_REQUEST,0);  
  18.     if(iResult == 0){  
  19.         printf("Connection closed.\n");  
  20.         HeapFree(GetProcessHeap(),0,szRequest);  
  21.         closesocket(socket);  
  22.         return 1;  
  23.     }else if(iResult == SOCKET_ERROR){  
  24.         printf("Connection error.(%d)\n",WSAGetLastError());  
  25.         HeapFree(GetProcessHeap(),0,szRequest);  
  26.         closesocket(socket);  
  27.         return 1;  
  28.     }else if(iResult > 0){  
  29.         printf("\tCommunicationThread(%d)\tBytes Received:(%d)\n",dwTid,iResult);  
  30.         printf("\tCommunicationThread(%d)\tReceived string:(%s)\n",dwTid,szRequest);  
  31.  
  32.         if(lstrcmpi(szRequest,"download file") == 0){  
  33.             HANDLE hFile;  
  34.             LPVOID lpReadBuf;  
  35.             DWORD dwBytesRead;  
  36.             DWORD dwFileSize;  
  37.             DWORD dwSendFile = 0;  
  38.             hFile = CreateFile("download.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
  39.             if(hFile == INVALID_HANDLE_VALUE){  
  40.                 printf("\tCommunicationThread\tCould not open file (error %d)\n",GetLastError());  
  41.                 send(socket,"error",6,0);  
  42.                 closesocket(socket);  
  43.                 return 1;  
  44.             }  
  45.             lpReadBuf = HeapAlloc(GetProcessHeap(),0,BUF_SIZE);  
  46.             dwFileSize = GetFileSize(hFile,NULL);  
  47.             while(1){  
  48.                 if(!ReadFile(hFile,lpReadBuf,BUF_SIZE,&dwBytesRead,NULL)){  
  49.                     printf("\tCommuncationThread could not read from file.(%d)\n",GetLastError());  
  50.                     closesocket(socket);  
  51.                     CloseHandle(hFile);  
  52.                     return 1;  
  53.                 }  
  54.                 bytesSent = send(socket,(LPSTR)lpReadBuf,dwBytesRead,0);  
  55.                 if(bytesSent == SOCKET_ERROR){  
  56.                     printf("\tCommuncationThread\tsend error %d\n",WSAGetLastError());  
  57.                     closesocket(socket);  
  58.                     CloseHandle(hFile);  
  59.                     return 1;  
  60.                 }  
  61.                 printf("\tCommuncationThread(%d)\tsend %d bytes.\n",dwTid,bytesSent);  
  62.                 dwSendFile +=dwBytesRead;     
  63.                 if(dwSendFile == dwFileSize){  
  64.                     printf("CommuncationThread downdload file ok.\n");  
  65.                     break;  
  66.                 }  
  67.             }  
  68.             HeapFree(GetProcessHeap(),0,lpReadBuf);  
  69.             CloseHandle(hFile);  
  70.             closesocket(socket);  
  71.         }else if (lstrcmpi(szRequest,"get information") == 0)  
  72.         {  
  73.             bytesSent = send(socket,"This is information",lstrlen("This is information")+1,0);  
  74.             if(bytesSent == SOCKET_ERROR){  
  75.                 printf("\tCommuncationThread get infomation error.(%d)\n",WSAGetLastError());  
  76.                 closesocket(socket);  
  77.                 return 1;  
  78.             }  
  79.             printf("\tCommuncationThread(%d)\tsend %d bytes.\n",dwTid,bytesSent);  
  80.         }else{  
  81.             printf("invalid request\n");  
  82.         }  
  83.         HeapFree(GetProcessHeap(),0,szRequest);  
  84.         closesocket(socket);  
  85.         return 0;  
  86.     }  
  87. }  
  88.  
  89. int main(void){  
  90.     WSADATA wsaData;  
  91.     SOCKET ListenSocket = INVALID_SOCKET;  
  92.     SOCKET ClientSocket = INVALID_SOCKET;  
  93.     ADDRINFO * result = NULL;  
  94.     ADDRINFO hints;  
  95.     int iResult;  
  96.  
  97.     iResult = WSAStartup(MAKEWORD(2,2),&wsaData);  
  98.     if(iResult !=0){  
  99.         printf("WSAStartup failed.(%d)\n",iResult);  
  100.         return 1;  
  101.     }  
  102.     ZeroMemory(&hints,sizeof(hints));  
  103.     hints.ai_family = AF_INET;  
  104.     hints.ai_socktype = SOCK_STREAM;  
  105.     hints.ai_protocol = IPPROTO_TCP;  
  106.     hints.ai_flags = AI_PASSIVE;  
  107.     iResult = getaddrinfo(NULL,DEFAULT_PORT,&hints,&result);  
  108.     if(iResult != 0){  
  109.         printf("getaddrinfo failed.(%d)\n",iResult);  
  110.         WSACleanup();  
  111.         return 1;  
  112.     }  
  113.     ListenSocket = socket(result->ai_family,result->ai_socktype,result->ai_protocol);  
  114.     if(ListenSocket == INVALID_SOCKET){  
  115.         printf("Create socket failed.(%d)\n",WSAGetLastError());  
  116.         freeaddrinfo(result);  
  117.         WSACleanup();  
  118.         return 1;  
  119.     }  
  120.     iResult = bind(ListenSocket,result->ai_addr,(int)result->ai_addrlen);  
  121.     if(iResult == SOCKET_ERROR){  
  122.         printf("bind failed.(%d)\n",WSAGetLastError());  
  123.         freeaddrinfo(result);  
  124.         closesocket(ListenSocket);  
  125.         WSACleanup();  
  126.         return 1;  
  127.     }  
  128.     printf("bind.\n");  
  129.     freeaddrinfo(result);  
  130.     iResult = listen(ListenSocket,SOMAXCONN);  
  131.     printf("start listen...\n");  
  132.     if(iResult == SOCKET_ERROR){  
  133.         printf("listen error.(%d)\n",WSAGetLastError());  
  134.         closesocket(ListenSocket);  
  135.         WSACleanup();  
  136.         return 1;  
  137.     }  
  138.     while(1){  
  139.         printf("ready to accept\n");  
  140.         ClientSocket = accept(ListenSocket,NULL,NULL);  
  141.         printf("accept a connection.\n");  
  142.         if(ClientSocket == INVALID_SOCKET){  
  143.             printf("accept failed.(%d)\n",WSAGetLastError());  
  144.             closesocket(ListenSocket);  
  145.             break;  
  146.         }  
  147.         if(!CreateThread(NULL,0,CommunicationThread,(LPVOID)ClientSocket,0,NULL)){  
  148.             printf("Create Thread error (%d).\n",GetLastError());  
  149.             break;  
  150.         }  
  151.     }  
  152.     WSACleanup();  
  153.     return 0;  

 












本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/683842,如需转载请自行联系原作者

相关文章
|
29天前
|
Java 开发者
如何通过易语言多线程提升程序响应速度
如何通过易语言多线程提升程序响应速度
135 62
|
22天前
|
Java 开发者
如何通过易语言多线程提升程序响应速度?
如何通过易语言多线程提升程序响应速度?
|
29天前
|
监控 Java API
|
2月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
2月前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
3月前
|
Rust 并行计算 安全
揭秘Rust并发奇技!线程与消息传递背后的秘密,让程序性能飙升的终极奥义!
【8月更文挑战第31天】Rust 以其安全性和高性能著称,其并发模型在现代软件开发中至关重要。通过 `std::thread` 模块,Rust 支持高效的线程管理和数据共享,同时确保内存和线程安全。本文探讨 Rust 的线程与消息传递机制,并通过示例代码展示其应用。例如,使用 `Mutex` 实现线程同步,通过通道(channel)实现线程间安全通信。Rust 的并发模型结合了线程和消息传递的优势,确保了高效且安全的并行执行,适用于高性能和高并发场景。
59 0
|
3月前
|
开发框架 Android开发 iOS开发
跨平台开发的双重奏:Xamarin在不同规模项目中的实战表现与成功故事解析
【8月更文挑战第31天】在移动应用开发领域,选择合适的开发框架至关重要。Xamarin作为一款基于.NET的跨平台解决方案,凭借其独特的代码共享和快速迭代能力,赢得了广泛青睐。本文通过两个案例对比展示Xamarin的优势:一是初创公司利用Xamarin.Forms快速开发出适用于Android和iOS的应用;二是大型企业借助Xamarin实现高性能的原生应用体验及稳定的后端支持。无论是资源有限的小型企业还是需求复杂的大公司,Xamarin均能提供高效灵活的解决方案,彰显其在跨平台开发领域的强大实力。
42 0
|
3月前
|
Java 调度
|
3月前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
48 0