c++ - 套接字监听不会在 linux 下的 C++ 中解除绑定(bind)

标签 c++ linux sockets

我有一个监听某个端口的套接字。 我将 SIGSTOP 信号发送到在端口上等待的线程(使用接受)并终止它。然后我关闭我等待的套接字的 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 标志。

关于c++ - 套接字监听不会在 linux 下的 C++ 中解除绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208581/

相关文章:

c++ - 为什么 [[nodiscard]] 只鼓励编译器发出警告而不要求它?

c++ - 这段 C++ 代码有什么问题?

c++ - Github 通过克隆获得必要的库

ios - 是否可以在 Apple iOS 设备上激活 TCP keepalive

c++ - 不能将 typeof(std::endl) 作为模板参数?

linux - 我可以逐行读取hadoop文件吗

linux - BlueZ:从命令行发送 LE 定向广告

c++ - 绝对路径...困惑(ubuntu)

java - 使用来自 C++ 的 java 套接字接收 float

c - 在 C 中使用套接字