【问题标题】:Binding a port for client tcp socket为客户端 tcp 套接字绑定端口
【发布时间】: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


【解决方案1】:

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

如果您只想将bind() 连接到特定端口,但允许操作系统为您选择合适的接口,则改为绑定到0.0.0.0 (INADDR_ANY)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2019-01-31
    • 1970-01-01
    • 2012-03-29
    • 2013-10-24
    • 2011-03-16
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多