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

为客户端tcp套接字绑定端口,c,linux,sockets,tcp,network-programming,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;

我有一个关于“为客户端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\u cli\u connect(“220.181.111.86”,80,“127.0.0.1”,40888)
(220.181.111.86是Internet上的地址)时,将显示一个错误:错误:无效参数

如果我在代码中注释
bind(sockfd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))
,一切都会很好,并且会为客户端套接字使用一个随机端口

但是,当我执行
tcpv4\u cli\u connect(“127.0.0.1”,80,“127.0.0.1”,40888)”时,无论是否将端口绑定到客户端套接字,都可以

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

/br
Ruan

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


如果您只想将
bind()
绑定到特定端口,但允许操作系统为您选择合适的接口,那么请将其绑定到
0.0.0
INADDR\u ANY
)。

检查
bind
返回的错误(如果有)。另外,您可以解释为什么要绑定本地地址吗?您确定有从localhost接口到要连接的服务器的路由吗?你试过绑定到外部接口了吗?@JoachimPileborg,啊,你启发了我,我不应该将它绑定到一个不能作为Internet地址的环回地址,多么愚蠢的错误。你根本不应该绑定它。在客户端中不需要绑定,除非配置错误。@EJP:如果计算机同时连接到多个网络,并且您需要指定客户端在连接到服务器时应使用的特定网络,则有时需要在本地绑定。