Информация об изменениях

Сообщение Re[3]: Линукс: проветить локальность IP-адреса от 13.02.2020 15:35

Изменено 13.02.2020 15:50 Reset

Re[3]: Линукс: проветить локальность IP-адреса
Попробуй сделать bind к нему (к нулевому порту, чтобы порт выбирался автоматом).
Re[3]: Линукс: проветить локальность IP-адреса
Попробуй сделать bind к нему (к нулевому порту, чтобы порт выбирался автоматом).

  Пример, где если убрать htobe32 для loopback или указать другой IP, то bind выйдет с ошибкой.
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>

#include <endian.h>
#include <unistd.h>

#include <cstdlib>
#include <cstdio>
#include <cstring>

#define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main()
{
    int sfd, cfd;
    struct sockaddr_in my_addr, peer_addr;
    socklen_t peer_addr_size;

    sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sfd == -1)
        handle_error("create socket");

    memset(&my_addr, 0, sizeof(struct sockaddr_in));
    /* Clear structure */
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = 0;
    my_addr.sin_addr.s_addr = htobe32( INADDR_LOOPBACK );

    if (bind(sfd, (struct sockaddr *) &my_addr,
            sizeof(struct sockaddr_in)) == -1)
        handle_error("bind");

    if( listen(sfd, 1024) == -1 )
        handle_error("listen");

    /* Now we can accept incoming connections one
       at a time using accept(2) */
    peer_addr_size = sizeof(struct sockaddr_in);
    cfd = accept(sfd, (struct sockaddr *) &peer_addr,
            &peer_addr_size);
    if (cfd == -1)
        handle_error("accept");
    close( cfd );

    /* Code to deal with incoming connection(s)... */

    /* When no longer required, the socket pathname, MY_SOCK_PATH
       should be deleted using unlink(2) or remove(3) */
}