【发布时间】:2014-10-21 01:59:26
【问题描述】:
我有一个关于“为客户端 tcp 套接字绑定本地端口”的问题。
代码如下:
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;
}
当我在主函数中执行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
阮
【问题讨论】:
-
检查
bind返回什么(如果有)错误。 -
另外,你能解释一下为什么你要绑定本地地址吗?你确定有从本地主机接口到你想连接的服务器的路由吗?您是否尝试过绑定到外部接口?
-
@JoachimPileborg,啊,你赐教,我不应该把它绑定到一个不能用于Internet地址的环回地址,这是一个愚蠢的错误。
-
你根本不应该绑定它。在客户端中没有必要,除非配置错误。
-
@EJP:有时需要在本地绑定,如果机器同时连接到多个网络,您需要指定客户端在连接服务器时应该使用哪个特定网络。
标签: c linux sockets tcp network-programming