【问题标题】:Linux, C, socket: how to specify TCP client port with structure sockaddr_storageLinux,C,socket:如何使用结构 sockaddr_storage 指定 TCP 客户端端口
【发布时间】:2016-05-13 09:50:20
【问题描述】:

我正在尝试创建具有多个 TCP 连接的 Linux 工具,它同时支持 IPv4 和 IPv6,因此我选择使用“sockaddr_storage”。

现在,我的问题是,如何将客户端套接字绑定到指定(或随机)的 TCP 端口?

对于 TCP 客户端,在一个线程中,如果我只创建 10 个套接字然后 connect() 到服务器,那么这 10 个套接字将在客户端使用顺序 TCP 端口,例如,从 54594 开始,然后是 54596、54600 , 54602 等。

现在,我想将这些客户端套接字绑定到不同的(随机)TCP 端口,我该如何处理 sockaddr_storage?

谢谢!

=============添加代码============

struct sockaddr_storage local_addr; 

sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)    

(*(struct sockaddr_in*)&local_addr).sin_port = 0;
local_addr_size = sizeof(local_addr);
bind(sockfd, (struct sockaddr *)&local_addr, local_addr_size);

............
connect(sockfd, p->ai_addr, p->ai_addrlen)

【问题讨论】:

  • 您的代码缺少所有错误检查。没有它,调试只是一个猜谜游戏。任何返回 -1 的系统调用都应该导致您调用 perror() 或朋友,并且不会像成功一样继续。
  • 这只是原型代码。但无论如何,感谢您检查错误代码的建议。
  • 别自欺欺人。您只有在调试后才进行错误检查?您现在就需要错误消息。这就是您必须提出这个问题的原因。

标签: c linux sockets tcp port


【解决方案1】:

我想将这些客户端套接字绑定到不同的(随机)TCP 端口

当您调用 connect() 而不先调用 bind() 时,这种情况会自动发生。您不需要为此编写任何代码,因此sockaddr_storage 根本不会涉及它。

【讨论】:

  • 谢谢 - 我以前做过,但看起来不起作用。我刚刚粘贴了我的代码,你能帮我再检查一遍吗?
  • 对不起,这是我的错误。是的,您的解决方案有效:) 我进行了更改,但我没有“安装”我的新位,所以当从 cmd 行运行时,它运行以前安装的版本,而不是我更改的版本。
猜你喜欢
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2016-09-15
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
相关资源
最近更新 更多