2012-05-16 17 views
1

我试图解决以下介绍POSIX套接字锻炼:POSIX套接字bind()的练习

写TCP呼应客户端实现“使系统同时选择地址和端口使用绑定()”。

(我假设“系统”是指OS)。

我不明白为什么一个bind()的调用是在必要时连接()执行上述方式绑定(纠正我,如果我不正确的)。另外,为了完成这种行为,提供给bind()调用的套接字地址需要sin6_addr和sin6_port的值?

+0

'bind'获得一个开放端口,'connect'尝试连接到一个目标'listen'端口。它们被分开用于端口重用。 [更多信息](http://www.scottklement.com/rpg/socktut/bindapi。html) – Naszta

回答

2

你是对的,bind调用是没有必要的。如果您没有bind,系统将会在您connect中选择源地址和源端口。

这是一个练习。这只是测试你是否知道如何使用bind这种方式。

-1

编辑:这是已被问到的相反。对不起,我想这个问题是关于选择IP地址和端口的用户。感谢EJP指出了这一点。


This应该是你要找的。

,这应该是最有趣的部分:

clnt_addr.sin_family = AF_INET; 
clnt_addr.sin_addr.s_addr = INADDR_ANY; 
clnt_addr.sin_port = htons(33333); 
if (bind(sockfd, (struct sockaddr *) &clnt_addr, 
      sizeof(clnt_addr)) < 0) 
      error("ERROR on binding"); 

在这个例子中,插座之前的connect()只能被绑定到所需的端口(33333),但在你的运动,你可以改变第二将上述代码行转换为:

clnt_addr.sin_addr.s_addr = inet_addr("192.168.0.1"); 

将套接字绑定在特定的IP地址上。这里最重要的是在connect()设置TCP/IP通信的端点以使用所需的IP地址/端口之前,绑定套接字。如果没有bind(),你的套接字将会是无限的:内核会为你选择源IP地址,并且会为你的套接字分配一个随机源端口。

+2

这并没有完成系统选择端口的目标。 – EJP

+0

哎呀,我很抱歉,我完全误解了这个问题。我认为用户必须选择绑定地址和端口。那么,这可能是因为这是一个有趣的案例... – Avio

1

我不明白为什么一个bind()的调用是在必要时连接() 执行在上述方式绑定(纠正我,如果我 不正确的)。

你是对的。

此外,什么样的价值观sin6_addr和sin6_port的是提供给绑定套接字地址必要 ()调用来完成此 行为?

INADDR_ANY for IPv4。我将把IPv6作为读者的练习。

您还应该指定零作为端口号,然后系统会选择。