簡體   English   中英

應該將哪個 IP 地址綁定到服務器應用程序的套接字?

[英]What IP address should be bound to a server application's socket?

我最近才開始在 C 中使用 sockets。 今天我一直在嘗試編寫一個在我的舊筆記本電腦上運行的服務器應用程序,只是為了進行一些實驗。 我希望可以從遠程主機訪問服務器的服務,但我對服務器的套接字應該綁定到哪個 IP 地址感到困惑:是否有一個 IP 地址可以唯一地標識我的機器在線,或者我錯過了一個步驟(或可能還有更多)在這里?

struct sockaddr_in serverAddress;
memset(&serverAddress, 0, sizeof(serverAddress));

serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddress.sin_port = htons(8080);

if(bind(serverSocketDescriptor, (struct sockaddr*) &serverAddress, sizeof(serverAddress)) < 0) {

    printf("bind() failed\n");
    closesocket(serverSocketDescriptor);
    WSACleanup();
    return EXIT_FAILURE;
}

您想綁定到INADDR_ANY ,它轉換為 0.0.0.0。

serverAddress.sin_addr.s_addr = INADDR_ANY;

綁定到這個地址意味着套接字綁定到所有本地地址,包括本地主機和主機可能擁有的任何外部 IP。

建議閱讀: 服務器代碼序列

//  int socket(int domain, int type, int protocol);
sock_t sock = socket(AF_INET, SOCK_STREAM, 0);
if( sock < 0 )
{
    perror( "socket failed" );
    exit( EXIT_FAILURE );
}

// if wanting to set any socket options (setsockopt())
// this is the place to do so

struct sockaddr_in server;
memset(&server, 0, sizeof(server));

server.sin_family      = AF_INET;
server.sin_addr.s_addr = inet_addr( INADDR_ANY ); 
server.sin_port        = htons(8080);  


if( bind( sock, (struct sockaddr*) &server, sizeof(server) ) ) 
{
    perror( "bind() failed" );
    close( sock );
    exit( EXIT_FAILURE );
}

if( listen(sock, 5) )
{
    perror( "listen failed" );
    exit( EXIT_FAILURE );
}

struct sockaddr_in client;
size_t len = sizeof( client ); 

while(1)
{
    sock_t clientSock = accept(sock, &client, &len); 
    if( clientSock <  0 )
    {
        perror( "accept failed" );
        continue;
    }

    // handle client connection
    close( clientSock );
}


close( sock );

注意:為了長期保持一致,運行此代碼的計算機需要具有“靜態”IP 地址,而不是“動態”IP 地址。

暫無
暫無

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

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