2016-02-03 56 views
0

我试图用多个TCP连接创建Linux工具,它支持IPv4和IPv6,因此我选择使用“sockaddr_storage”。Linux,C,socket:如何使用结构指定TCP客户端端口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) 
+0

您的代码缺少所有错误检查。没有它,调试只是一个猜测游戏。任何返回-1的系统调用都会导致你调用'perror()'或者朋友,并且不会像成功一样继续。 – EJP

+0

这只是原型代码。但无论如何,感谢您的建议,检查错误代码。 –

+0

不要欺骗自己。你只在调试完成后才把错误检查放进去?你现在需要错误信息*。这就是为什么你不得不问这个问题。 – EJP

回答

1

我想结合那些客户端套接字到不同(随机)TCP端口

如果您先拨打bind()并致电connect(),则会自动发生。您不需要为此编写任何代码,因此根本不会进入该代码。

+0

谢谢 - 我以前做过,但看起来不起作用。我只是粘贴了我的代码,你能帮我检查一遍吗? –

+1

定义'不起作用'。 – EJP

+0

对不起,这是我的错。是的,你的解决方案工作:)我做了改变,但我没有“安装”我的新位,所以当从cmd行运行时,它运行以前安装的版本,而不是我更改的版本。 –