源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

c语言socket多线程编程限制客户端连接数

  • 时间:2022-05-24 13:16 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:c语言socket多线程编程限制客户端连接数
先上一些多线程需要使用的函数定义:
[u]复制代码[/u] 代码如下:
DWORD WINAPI ProcessClientRequests(LPVOID lpParam)  //新线程将会执行的函数定义 {       return 0; } HANDLE handler=CreateThread(NULL, 0, ProcessClientRequests, &clientsocket, 0, NULL);   //这里比较简单,&clientsocket是个指针,是从主线程传入新线程的参数 WaitForMultipleObjects(MAXCLIENTS, threads, TRUE, INFINITE);  //用来阻塞主线程,直到所有创建的子线程都完成任务为止,才继续执行后面的代码 for(int i=0;i<MAXCLIENTS; i++) {     CloseHandle(threads[i]);       //创建的每个子线程的HANDLE都会被保存在HANDLE数组中,这个函数用于关闭各个handle所对应的线程空间 }
服务器端程序 主线程代码如下:
[u]复制代码[/u] 代码如下:
#define MAXCLIENTS 3           //宏定义,最多3个客户端连接 int main() {     WSADATA wsaData;     WSAStartup(MAKEWORD(2, 2), &wsaData);     HANDLE threads[MAXCLIENTS];     SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);     sockaddr_in sockaddr;     sockaddr.sin_family=PF_INET;     sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");     sockaddr.sin_port=htons(9000);     bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));     listen(s, 1);     printf("listening on port [%d].\n", 9000);     int existingClientCount=0;     while(TRUE)     {         SOCKADDR clientAddr;         int size=sizeof(SOCKADDR);         SOCKET clientsocket;         clientsocket=accept(s, &clientAddr, &size);         printf("***SYS***    New client touched.\n");         if(existingClientCount<MAXCLIENTS)       //判断是否已经超出最大连接数了         {             threads[existingClientCount++]=CreateThread(NULL, 0, ProcessClientRequests, &clientsocket, 0, NULL);  //启动新线程,并且将socket传入         }         else         {             char* msg="Exceeded Max incoming requests, will refused this connect!\r\n";             send(clientsocket, msg, strlen(msg)+sizeof(char), NULL);       //发送拒绝连接消息给客户端             printf("***SYS***    REFUSED.\n");             closesocket(clientsocket);                                     //释放资源             break;         }     }     printf("Maximize clients occurred for d%.\r\n", MAXCLIENTS);     WaitForMultipleObjects(MAXCLIENTS, threads, TRUE, INFINITE);           //等待所有子线程,直到完成为止     closesocket(s);     for(int i=0;i<MAXCLIENTS; i++)     {         CloseHandle(threads[i]);                                           //清理线程资源     }     WSACleanup();     printf("Cleared all.\r\n");     getchar();     exit(0); }
子线程函数定义
[u]复制代码[/u] 代码如下:
DWORD WINAPI ProcessClientRequests(LPVOID lpParam) {     SOCKET* clientsocket=(SOCKET*)lpParam;  //这里需要强制转换,注意:指针类型的     char* msg="Hello, my client.\r\n";     send(*clientsocket, msg, strlen(msg)+sizeof(char), NULL);     printf("***SYS***    HELLO.\n");     while(TRUE)     {         char buffer[MAXBYTE]={0};         recv(*clientsocket, buffer, MAXBYTE, NULL);         if(strcmp(buffer, "exit")==0)         {             char* msg_bye="Bye.\r\n";             send(*clientsocket, msg_bye, strlen(msg_bye)+sizeof(char), NULL);             break;         }         printf("***Client***    %s\n", buffer);     }     closesocket(*clientsocket);     return 0; }
[img]http://files.jb51.net/file_images/article/201312/20131205102052.jpg?2013115102113[/img]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部