
这是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 WSAint result = WSAStartup(MAKEWORD(2,2),(LPWSADATA) &wsaData);if(result < 0){ throw "WSAStartup ERROR."; return;}//create the socketresult = (serverSocket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP));if(result < 0){ throw "Socket Connect ERROR."; return;}//bind socket to address/portSOCKADDR_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(),但这两个都引发了错误.
谢谢大家的时间和帮助!
解决方法 首先,确保在服务器套接字上设置SO_REUSEADDR选项才能重新开始侦听.然后,我猜,你的问题是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中停止/重新启动服务器套接字上的侦听和接受?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)