欢迎来到山村网

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

2019-03-02 11:00:07浏览:974 来源:山村网   
核心摘要:这篇文章主要介绍了c语言socket多线程编程,可以限制客户端连接数,大家参考使用吧先上一些多线程需要使用的函数定义:代码如下:D

这篇文章主要介绍了c语言socket多线程编程,可以限制客户端连接数,大家参考使用吧

先上一些多线程需要使用的函数定义:代码如下: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所对应的线程空间}服务器端程序主线程代码如下:代码如下:#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!rn"; send(clientsocket, msg, strlen(msg)+sizeof(char), NULL); //发送拒绝连接消息给客户端 printf("***SYS*** REFUSED.n"); closesocket(clientsocket);//释放资源 break; } } printf("Maximize clients occurred for d%.rn", MAXCLIENTS); WaitForMultipleObjects(MAXCLIENTS, threads, TRUE, INFINITE); //等待所有子线程,直到完成为止 closesocket(s); for(int i=0;i<MAXCLIENTS; i++) { CloseHandle(threads[i]); //清理线程资源 } WSACleanup(); printf("Cleared all.rn"); getchar(); exit(0);}子线程函数定义代码如下:DWORD WINAPI ProcessClientRequests(LPVOID lpParam){ SOCKET* clientsocket=(SOCKET*)lpParam; //这里需要强制转换,注意:指针类型的 char* msg="Hello, my client.rn"; 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.rn"; send(*clientsocket, msg_bye, strlen(msg_bye)+sizeof(char), NULL); break; } printf("***Client*** %sn", buffer); } closesocket(*clientsocket); return 0;}
(责任编辑:豆豆)
下一篇:

C#中的基元类型

上一篇:

深入理解C语言内存对齐

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com