【问题标题】:What effects does restarting a listening socket have on accepted connections?重新启动侦听套接字对接受的连接有什么影响?
【发布时间】:2016-07-08 03:41:42
【问题描述】:

根据 POSIX,当一个进程 accept()s 连接到 listen()ing socket() L1,然后是 close()s L1,并创建一个新的 socket()L2 绑定在同一接口/地址/端口,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?

【问题讨论】:

  • 您需要添加一些代码来说明您的观点。我不明白你在问什么。
  • @SergeyA 我现在添加的例子怎么样?

标签: sockets posix


【解决方案1】:

尽管socket() 的使用不正确 - 第一个参数应该是地址族,而不是协议族,因此是 AF_INET - 代码将按预期工作。

一旦accept()返回一个新的socket,它就完全独立于监听的socket,不受它的影响。

【讨论】:

  • 修复了socket() 参数。
  • 它是否也独立于使用相同绑定创建的新侦听套接字?例如。如果所有接口上的新旧套接字都绑定到 0.0.0.0 上的 TCP 端口 12345?
  • @jotik,没关系。它现在是自己的套接字。
  • 你能提供一个参考吗?
  • 没有具体的参考。只是没有任何关于依赖的参考。例如,这是来自 man accept():成功时,这些系统调用返回一个非负整数,它是已接受套接字的描述符。它没有说明父套接字,所以我们假设它是独立的。
猜你喜欢
  • 2011-12-10
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2021-12-16
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多