在Linux下,Socket侦听不会在C ++中解除绑定

我有一个侦听某个端口的套接字。 我发送SIGSTOP信号给在端口上等待的线程(使用accept)并终止它。 然后closures我等待的套接字的fd。 但是对于我的下一个项目来说,它不允许我再次在这个端口上收听。 我的程序是在Linux下的C ++。 我该怎么办?

我的代码的一些部分是:线程1:

void* accepter(void *portNo) { int newsockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); } struct sockaddr_in server; bzero((char *) & server, sizeof (server)); server.sin_family = AF_INET; server.sin_port = htons(*(int*) portNo); server.sin_addr.s_addr = INADDR_ANY; if (bind(sockfd, (struct sockaddr *) & server, sizeof (struct sockaddr_in)) < 0) { perror("ERROR on binding"); } listen(sockfd, 50); while (true) { struct sockaddr_in client; socklen_t clientLen = sizeof (struct sockaddr_in); newsockfd = accept(sockfd, (struct sockaddr *) & client, &clientLen); if (accepterFlag) { break; } if (getpeername(newsockfd, (sockaddr *) & client, &clientLen) == -1) { perror("getpeername() failed"); } sem_wait(setSem); FD_SET(newsockfd, &set); if (maxFd < newsockfd) { maxFd = newsockfd; } sem_post(setSem); } 

主题2:

 listenerFlag = true; accepterFlag = true; sleep(1); pthread_kill(listenerThread, SIGSTOP); pthread_kill(accepterThread, SIGSTOP); close(sockfd); sem_wait(setSem); for (int i = 1; i <= maxFd; i++) { if (FD_ISSET(i, &set)) { close(i); } } sem_post(setSem); 

谢谢。

你是否知道,在你完成收听之后,套接字通常会保持一两分钟的缓存状态,以防止以前的过程与你交流? 这就是所谓的“TIME_WAIT”状态。

如果您想覆盖该行为,请在侦听之前使用setsockopt设置套接口的SO_REUSEADDR标志。

请参阅: 使用SO_REUSEADDR – 以前打开的套接字会发生什么?

我认为问题是你没有正确关闭套接字和/或你的程序。套接字可能仍然存在于操作系统中。 用nestat -an来检查它。 您还应该检查您的流程是否已经退出。 如果它已经正确结束,它应该关闭你的套接字。

你应该做的是:

  • 用信号中断你的线程。
  • 当中断时,你的线程应该在结束之前干净地关闭插座。
  • 那么你可以干净退出你的程序。

my2cents,