博思监听服务器已运行,如何在Winsock2 C中停止/重新启动服务器套接字上的侦听和接受?...

我在Visual Studio Pro C中创建了一个套接字(Winsock2)来监听端口上的连接(TCP).它工作得很好,但我让它在自己的线程中运行,我希望能够关闭它,希望以后重新启动它.我可以毫无问题地终止线程,但这样做并不会阻止套接字接受新客户端(也就是说,它在我关闭线程之前就已经接受了它所做的接受).我可以将新客户连接到它但没有任何反应……它只是接受而且就是这样.我想要的是阻止它听取和接受,然后能够告诉它稍后在同一个端口再次启动.现在尝试重新启动它只是告诉我端口已经被占用.

这是listen线程函数:

DWORD WINAPI ListeningThread(void* parameter){

TCPServer *server = (TCPServer*)parameter;

try{

server = new TCPServer(listen_port);

}catch(char* err){

cout<

return -1;

}

int result = server->start_listening();

if(result < 0){

cout<

return result;

}

cout<

while(true){

TCPClientProtocol *cl= new TCPClientProtocol(server->waitAndAccept());

HANDLE clientThread = CreateThread(0,AcceptThread,cl,0);

cout<

}

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(),但这两个都引发了错误.

谢谢大家的时间和帮助!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值