重新启动侦听套接字对接受的连接有什么影响?
What effects does restarting a listening socket have on accepted connections?
根据 POSIX,当进程 accept()
s 连接在 listen()
ing socket()
L1 上,然后 close()
s L1,并创建新的 socket()
L2 绑定在相同的 interface/address/port、listen()
s 和 accept()
s 新连接上,从先前的侦听套接字 L1 接受的套接字是否会像 L1 一样正常运行没有被关闭?还是一开始就不可能以这种方式创建和启动套接字 L2?请提供参考。
示例:
int server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(server, &someAddress, sizeof(someAddress)))
listen(server, 0);
int conn_1 = accept(server, NULL, NULL);
/* ... */
int conn_n = accept(server, NULL, NULL);
/* RESTART LISTENING SOCKET: */
close(server);
server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(server, &someAddress, sizeof(someAddress)))
listen(server, 0);
int newconn_1 = accept(server, NULL, NULL);
/* ... */
int newconn_n = accept(server, NULL, NULL);
/* Will connections conn_1...conn_n still properly operate at this point?
尽管 socket()
的用法不正确 - 第一个参数应该是地址族,而不是协议族,因此 AF_INET - 代码将按预期工作。
一旦accept()
returns一个新的套接字,就完全独立于监听套接字,不受其影响
根据 POSIX,当进程 accept()
s 连接在 listen()
ing socket()
L1 上,然后 close()
s L1,并创建新的 socket()
L2 绑定在相同的 interface/address/port、listen()
s 和 accept()
s 新连接上,从先前的侦听套接字 L1 接受的套接字是否会像 L1 一样正常运行没有被关闭?还是一开始就不可能以这种方式创建和启动套接字 L2?请提供参考。
示例:
int server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(server, &someAddress, sizeof(someAddress)))
listen(server, 0);
int conn_1 = accept(server, NULL, NULL);
/* ... */
int conn_n = accept(server, NULL, NULL);
/* RESTART LISTENING SOCKET: */
close(server);
server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(server, &someAddress, sizeof(someAddress)))
listen(server, 0);
int newconn_1 = accept(server, NULL, NULL);
/* ... */
int newconn_n = accept(server, NULL, NULL);
/* Will connections conn_1...conn_n still properly operate at this point?
尽管 socket()
的用法不正确 - 第一个参数应该是地址族,而不是协议族,因此 AF_INET - 代码将按预期工作。
一旦accept()
returns一个新的套接字,就完全独立于监听套接字,不受其影响