绑定客户端tcp套接字的端口

时间:2014-10-21 01:59:26

标签: c linux sockets tcp network-programming

我遇到了'为客户端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;
}  

当我在main函数中执行tcpv4_cli_connect("220.181.111.86", 80, "127.0.0.1", 40888)时,(220.181.111.86是Internet上的地址),将显示错误:出错:参数无效

如果我在代码中评论bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)),那么事情会很好,并且随机端口用于客户端套接字。

但是当我tcpv4_cli_connect("127.0.0.1", 80, "127.0.0.1", 40888)执行是否将端口绑定到客户端套接字时,它是正常的。

无效参数对连接操作意味着什么?我想知道是否只允许绑定客户端连接到本地地址的特定端口?客户端只能使用随机端口连接到外部服务器? 我有什么不明白的吗?

/ BR

1 个答案:

答案 0 :(得分:1)

当您bind()127.0.0.1INADDR_LOOPBACK)时,您绑定的环回接口无法访问外部世界,只能绑定到自身,因此您无法{{ 1}}到connect()以外的任何IP。如果在127.0.0.1到外部服务器时想要bind()到本地接口,则必须绑定到连接到可以到达该服务器的网络的接口的实际IP。

如果您只想connect()到特定端口,但允许操作系统为您选择适当的接口,则绑定到bind()0.0.0.0)。< / p>