Я сделал сокет (Winsock2) в Visual Studio Pro C ++ для прослушивания порта для соединений (TCP). Он работает отлично, но я позволил ему работать в своем собственном потоке, и я хочу иметь возможность закрыть его с надеждой перезапустить его позже. Я могу завершить поток без проблем, но это не мешает сокету принимать новых клиентов (т. Е. Он задерживается на принятии, которое он делал до того, как я закрыл поток). Я могу подключить к нему новых клиентов, но ничего не происходит ... он просто принимает и все. Я хочу, чтобы он не слушал и не принимал, а затем мог попросить его запустить позже на том же порту. Попытка перезагрузить его теперь просто говорит мне, что порт уже занят.
Вот функция прослушивания потока:
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, 0, AcceptThread, cl, 0, 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 (), но оба из них сгенерировали ошибки.
Спасибо всем за ваше время и помощь!