【问题标题】:getsockname() can assign port to struct addr_in?getsockname() 可以将端口分配给 struct addr_in?
【发布时间】:2013-08-21 15:45:34
【问题描述】:
self._socket = socket(AF_INET, SOCK_DGRAM, 0);

// create addr
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
addr.sin_addr.s_addr = INADDR_ANY;

// bind socket
bind(self._socket, (struct sockaddr *)&addr, sizeof(addr));

printf("befor getsockname()->%d\n", ntohs(addr.sin_port));
socklen_t len = sizeof(addr);
getsockname(self._socket, (struct sockaddr *)&addr, &len); // if i comment this func, the last printf() will print 0; if not, it will print a real in use udp port(and it is correct!)
printf("after getsockname()->%d\n", ntohs(addr.sin_port));

那么,当分配 htons(0) 到一个端口时,本地套接字是否必须使用 getsockname() 为自己分配一个可用端口?还是别的什么? 我想这可能是因为我只是将 0 绑定到 sin_port,这意味着分配一个随机端口但系统尚未分配,所以只需调用 getsockname() 以使系统真正分配一个端口。

【问题讨论】:

  • 正如名称 sais gethostname() 正在获取一些东西,即有关传入套接字的信息。设置应用于它的第二个参数:struct sockaddr_XYZ 的成员设置为描述传递的套接字的值在。

标签: c networking


【解决方案1】:

那么,当分配 htons(0) 到一个端口时,本地套接字是否必须使用 getsockname() 为自己分配一个可用端口?还是别的什么?

不,您必须使用bind() 将端口分配给套接字。 getsockname() 告诉您如果您指定为零,则分配了哪个端口。

【讨论】:

  • 是的,你说的就是我想的!但是在这段代码中,当我评论getsockname()时,最后一个printf()只是printf 0作为第一个printf()!我想这可能是因为我只是将 0 绑定到 sin_port,这意味着分配一个随机端口但系统尚未分配,所以只需调用 getsockname() 以使系统真正分配一个端口
  • 没有。它不这样做。它是吸气剂,而不是二传手。 bind() 执行此操作,如果您没有调用 bind(),则为 connect()。
【解决方案2】:

getsockname 函数的全部意义在于获取套接字本地端的sockaddr。对于 IPv4 套接字,这是一个 sockaddr_in 类型的对象,它包含 IP 地址和端口。

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 2016-10-12
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2013-09-01
    • 2020-12-07
    相关资源
    最近更新 更多