Какой IP-адрес должен быть привязан к сокету серверного приложения? - PullRequest
0 голосов
/ 07 апреля 2020

Я только недавно начал играть с сокетами в C. Сегодня я пытался написать серверное приложение для запуска на моем старом ноутбуке, просто чтобы немного поэкспериментировать. Мне бы хотелось, чтобы службы сервера были доступны с удаленных хостов, и я не понимаю, к какому 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;
}

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Вы хотите привязать к INADDR_ANY, что означает 0.0.0.0.

serverAddress.sin_addr.s_addr = INADDR_ANY;

Привязка к этому адресу означает, что сокет связан со всеми локальными адресами, включая localhost и любые внешние IP-адреса хоста. может иметь.

0 голосов
/ 07 апреля 2020

Предложить чтение: последовательность кода сервера

//  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-адрес «stati c», а не IP-адрес «Dynami c».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...