Socket监听不会解压在C ++在linux下 [英] Socket listen doesn't unbind in C++ under linux

查看:193
本文介绍了Socket监听不会解压在C ++在linux下的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个侦听端口的套接字。
我发送SIGSTOP信号到等待端口的线程(使用accept)并终止它。然后我关闭我等待的套接字的fd。但是对于我的项目的下一次运行,它不允许我再次在该端口上监听。
我的程序是在C ++在linux下。
我应该怎么办?

I have a socket that listens on some port. I send the SIGSTOP signal to the thread that waits on the port(using accept) and terminate it. then I close the fd of the socket that I waited on. But for the next run of my project it doe's not allow me to listen on that port again. My program is in C++ under linux. What should I do?

我的代码的一些部分是:
主题1:

Some parts of my code are: Thread 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状态。

Did you know that sockets are typically kept in a kind of limbo for a minute or two after you've finished listening on them to prevent communications intended for the previous process coming to yours? It's called the 'TIME_WAIT' state.

如果要覆盖此行为,请使用 setsockopt 在侦听之前对套接字设置SO_REUSEADDR标志。

If you want to override that behaviour use setsockopt to set the SO_REUSEADDR flag against the socket before listening on it.

这篇关于Socket监听不会解压在C ++在linux下的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆