簡體   English   中英

綁定客戶端TCP套接字的端口

[英]Binding a port for client tcp socket

我有一個關於“為客戶端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上的地址),將顯示錯誤: 某些錯誤:無效的參數

如果我在代碼中注釋bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) ,一切都會好起來的,並且將隨機端口用於客戶端套接字。

但是tcpv4_cli_connect("127.0.0.1", 80, "127.0.0.1", 40888)無論是否將端口綁定到客戶端套接字,我都執行tcpv4_cli_connect("127.0.0.1", 80, "127.0.0.1", 40888) ,還可以。

無效參數對連接操作意味着什么? 我想知道是否只允許綁定特定端口以使客戶端連接到本地地址? 客戶端只能使用隨機端口連接到外部服務器嗎?
我有誤會的東西嗎?

/ BR

當您bind()127.0.0.1INADDR_LOOPBACK )時,您將綁定到無法訪問外界的環回接口,而只能訪問自身的環回接口,因此您不能connect()127.0.0.1以外的任何IP。 如果要在bind()外部connect()到外部服務器時connect()bind()到本地接口,則必須綁定到連接到可以訪問該服務器的網絡的接口的實際IP。

如果您要做的只是bind()到特定端口,但允許操作系統為您選擇合適的接口,則綁定到0.0.0.0INADDR_ANY )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM