|
在netbsd下试了,在另外一个线程或者信号响应事件中关闭监听套接字,accept()也不会返回。
为什么呢 :confused:
测试代码如下:
- // listen.cpp
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- #include <pthread.h>
- #include <stdio.h>
- struct control
- {
- int sock;
- int stop;
- };
-
- void *run(void *arg)
- {
- control *ctrl = (control*)arg;
- while (!ctrl->stop) {
- sockaddr_in addr;
- memset(&addr, 0, sizeof(addr));
- socklen_t addr_len = sizeof(addr);
- int conn = accept(ctrl->sock, (sockaddr*)&addr, &addr_len);
- if (ctrl->stop) {
- break;
- }
- if (conn != -1) {
- close(conn);
- }
- }
- return NULL;
- }
- void stop_thread(control *ctrl)
- {
- printf("closing socket...\n");
- ctrl->stop = 1;
- close(ctrl->sock);
- }
- int main(int argc, char *argv[])
- {
- if (argc != 2) {
- printf("usage: %s <port>\n", argv[0]);
- return -1;
- }
- unsigned short port = atoi(argv[1]);
-
- sockaddr_in addr;
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = INADDR_ANY;
- addr.sin_port = htons(port);
- int fd = socket(AF_INET, SOCK_STREAM, 0);
- bind(fd, (sockaddr*)&addr, sizeof(addr));
- listen(fd, 5);
- pthread_t child = 0;
- control *ctrl = new control;
- ctrl->sock = fd;
- ctrl->stop = 0;
- pthread_create(&child, NULL, run, ctrl);
- sleep(3);
- stop_thread(ctrl);
- pthread_join(child, NULL);
- delete ctrl;
- return 0;
- }
复制代码 |
|