gpt4 book ai didi

language-agnostic - listen() 不调用 bind()

转载 作者:可可西里 更新时间:2023-11-01 02:30:26 27 4
gpt4 key购买 nike

我尝试了以下方法:

int sockfd = socket(...);
listen(sockfd, 10);
accept(sockfd, ...);

所有调用都没有失败,程序刚刚开始阻塞,就好像我调用了 bind() 一样。在这种情况下会发生什么?是否因为没有本地地址或端口而永远无法接收连接?或者它是否隐式分配了一个本地地址和端口,现在它正在监听这些?如果是这样,我如何检索它们是什么?

最佳答案

调用有效,但由于您没有显式绑定(bind)套接字,操作系统或系统库隐式为您分配了一个端口和默认绑定(bind)(与调用 connect(2)< 时完全相同 而不是先调用 bind(2))。另外,由于您之前询问过有关 TCP 的内容,我假设您在这里谈论的是 Internet 套接字。

找出操作系统绑定(bind)套接字的名称因操作系统而异,因此您必须查找特定的操作系统,但大多数操作系统都提供了 netstat 或您可以使用的类似工具查询哪些应用程序正在监听哪些端口。

正如 John 在评论中提到的,您可以使用 getsockname(2) 来查找绑定(bind)套接字的名称。这是一个简短的例子:

// ...

// Create socket and set it to listen (we ignore error handling for brevity)
int sock = socket(AF_INET, SOCK_STREAM, 0);
listen(sock, 10);

// Sometime later we want to know what port and IP our socket is listening on
socklen_t addr_size = sizeof(struct sockaddr_in);
struck sockaddr_in addr;
getsockname(sock, (struct sockaddr *)&addr, &addr_size);

addr 现在将包含您的套接字正在监听的 IP 地址和端口。

关于language-agnostic - listen() 不调用 bind(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741061/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com