大佬教程收集整理的这篇文章主要介绍了如何在Winsock2 C中停止/重新启动服务器套接字上的侦听和接受?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是listen线程函数:
DWORD WINAPI ListeningThread(void* parameter){ TCPServer *server = (TCPServer*)parameter; try{ server = new TCPServer(listen_port); }catch(char* err){ cout<<"ERROR: "<<err<<endl; return -1; } int result = server->start_listening(); if(result < 0){ cout<<"ERROR: WSA Err # "<<WSAGetLastError()<<endl; return result; } cout<<"LISTENING: "<<result<<endl<<endl; while(true){ TCPClientProtocol *cl= new TCPClientProtocol(server->waitAndAccept()); HANDLE clientThread = CreateThread(0,AcceptThread,cl,0); cout<<"Connection spawned."<<endl; } return 0; }
以下是TCPServer中的相关功能:
TCPServer::TCPServer(int port){ listening = false; is_bound = false; //setup WSA int result = WSAStartup(MAKEWORD(2,2),(LPWSADATA) &wsaData); if(result < 0){ throw "WSAStartup ERROR."; return; } //create the socket result = (serverSocket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCp)); if(result < 0){ throw "Socket Connect ERROR."; return; } //bind socket to address/port SOCKADDR_IN sin; sin.sin_family = PF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = INADDR_ANY; result = bind(serverSocket,(LPSOCKADDR) &sin,sizeof(sin)); if(result < 0){ throw "Could not Bind socket - Make sure your SELEcted PORT is available."; return; } is_bound = true; } int TCPServer::start_listening(){ int result = -1; if(is_bound){ //SOMAXCONN parameter (maX) is a BACklog: // how many connections can be queued at any time. result = listen(serverSocket,SOMAXCONN); if(result >= 0) listening = true; } return result; } SOCKET TCPServer::waitAndAccept(){ if(listening) return accept(serverSocket,NULL,null); else return NULL; }
我已经尝试了closesocket()和shutdown(),但这两个都引发了错误.
谢谢大家的时间和帮助!
然后,我猜,你的问题是accept()块,你不能在需要时停止它,所以你杀了线程.解决方案不好这里正确的答案是异步I / O,即SELEct()或poll()或它们的Windows对应物.看看Advanced Winsock Samples.
多线程应用程序中的快速解决方案是在每个accept()之前检查一些is_it_time_to_stop_accepTing_connections标志,然后在停止时,翻转标志并连接到侦听端口(是的,在同一程序中).这将取消阻塞accept()并允许你做适当的closesocket()或其他.
但严重的是,请阅读asynchronous I/O.
以上是大佬教程为你收集整理的如何在Winsock2 C中停止/重新启动服务器套接字上的侦听和接受?全部内容,希望文章能够帮你解决如何在Winsock2 C中停止/重新启动服务器套接字上的侦听和接受?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。