我有一个关于'binging a local port for a client tcp socket'的问题 .
代码如下:
void tcpv4_cli_connect(const char *srvhost, in_port_t srvport,
const char *clihost, in_port_t cliport)
{
struct sockaddr_in srvaddr, cliaddr;
struct in_addr inaddr;
int sockfd;
bzero(&srvaddr, sizeof(srvaddr));
inet_aton(srvhost, &inaddr);
srvaddr.sin_family = AF_INET;
srvaddr.sin_addr = inaddr;
srvaddr.sin_port = htons(srvport);
bzero(&cliaddr, sizeof(cliaddr));
inet_aton(clihost, &inaddr);
cliaddr.sin_family = AF_INET;
cliaddr.sin_addr = inaddr;
cliaddr.sin_port = htons(cliport);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr));
if (connect(sockfd, (struct sockaddr *) &srvaddr, sizeof(srvaddr)) != 0)
perror("Something Wrong");
return;
}
int main(int argc, char *argv[])
{
// Wrong for "220.181.111.86", but ok for "127.0.0.1"
tcpv4_cli_connect("220.181.111.86", 80, "127.0.0.1", 40888);
return 0;
}
当我在main函数中执行 tcpv4_cli_connect("220.181.111.86", 80, "127.0.0.1", 40888)
时,(220.181.111.86是Internet上的地址),将显示错误: Something Wrong: Invalid argument .
如果我在代码中评论 bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr))
,事情会很好,并且随机端口用于客户端套接字 .
但是当我执行 tcpv4_cli_connect("127.0.0.1", 80, "127.0.0.1", 40888)
无论是否将端口绑定到客户端套接字时都没问题 .
无效参数对连接操作意味着什么?我想知道是否只允许绑定客户端连接到本地地址的特定端口?客户端只能使用随机端口连接到外部服务器?
我有什么不明白的吗?
/ BR
阮
1 回答
当您
bind()
到127.0.0.1
(INADDR_LOOPBACK
)时,您绑定的环回接口无法访问外部世界,只能绑定到自身,因此您不能connect()
到127.0.0.1
以外的任何IP . 如果要将connect()
发送到本地接口,则必须绑定到连接到可以访问该服务器的网络的接口的实际IP .如果你想做的只是
bind()
到一个特定的端口,但允许操作系统为你选择一个合适的接口,然后绑定到0.0.0.0
(INADDR_ANY
) .