【发布时间】:2011-01-13 14:16:11
【问题描述】:
我有一个侦听某个端口的套接字。 我将 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);
谢谢。
【问题讨论】:
-
也许尝试在接受线程终止时关闭套接字的 fd?
-
您确定要发送
SIGSTOP吗?以后有人要发SIGCONT吗?只要某些(停止的)线程仍在该套接字上的accept调用中,如果最终无法关闭套接字,我不会感到惊讶。 (你说你也终止了线程,我只是没有看到。)