Tôi có một ổ cắm nghe trên một số cổng. Tôi gửi tín hiệu SIGSTOP tới luồng chờ trên cổng (sử dụng chấp nhận) và chấm dứt nó. sau đó tôi đóng fd của ổ cắm mà tôi đã đợi. Nhưng cho lần chạy tiếp theo của dự án của tôi, nó không cho phép tôi nghe lại trên cổng đó nữa. Chương trình của tôi nằm trong C++ dưới Linux. Tôi nên làm gì?Ổ cắm nghe không unbind trong C + + theo linux
Một số phần của mã của tôi là: Chủ đề 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);
}
Chủ đề 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);
Cảm ơn bạn.
Có thể thử đóng fd của ổ cắm bên trong chuỗi chấp nhận vì nó đang kết thúc? –
Bạn có chắc chắn muốn gửi 'SIGSTOP'? Có ai sẽ gửi 'SIGCONT' sau không? Tôi sẽ không ngạc nhiên nếu ổ cắm cuối cùng có thể không được đóng miễn là một số (dừng) thread vẫn còn bên trong một cuộc gọi 'accept' trên ổ cắm đó. (Bạn nói rằng bạn cũng chấm dứt chủ đề, tôi chỉ không thấy điều đó.) –