Ошибка привязки (99): невозможно назначить запрошенный адрес

Я пытаюсь заставить работать следующий фрагмент кода, но получаю указанную выше ошибку. Я достаточно уверен, что адрес, который я ввожу, правильный, потому что он работает в отдельной программе, выполняющей аналогичную задачу. Это заставляет меня поверить, что я совершаю какую-то глупую ошибку, любая помощь будет оценена по достоинству!

   /*Create TCP socket*/
int tcp_socket(void)
{
    int s;
    while((s = socket(PF_INET,SOCK_STREAM,0))==-1 && errno == EINTR){
        continue;
    }
    return s;
}

/*Bind tcp*/
int tcp_bind(int s, char *server, uint16_t port)
{
    int             rv;
    struct sockaddr_in  sin;
    struct hostent      *host_addr;

    assert(s >= 0);

    host_addr = gethostbyname(server);
    if (!host_addr) {
        perror("gethostbyname(server)");
        return -1;
    }


    memset(&sin, '\0', sizeof sin);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(port);

    sin.sin_addr = *((struct in_addr *)host_addr->h_addr);

    while((rv = bind(s,(struct sockaddr *)&sin, sizeof sin)) == -1
            && errno == EINTR) {
        continue;           
    }
    return (rv == 0) ? 0 : errno;
}

int connect_to_server()
{
    int rv;
    int socket = tcp_socket();
    _logf(LOG_DEBUG, "LOG %s:%d (%s) - %s:%d", __FILE__, __LINE__, __func__, "Socket created:", socket);

    rv = tcp_bind(socket,options.server_p, options.dest_port);
    if(rv != 0) {
        _logf(LOG_ALERT, "LOG %s:%d (%s) - %s:%s", __FILE__, __LINE__, __func__, "tcp_bind failed, error", strerror(rv));
        return -1;
    }
    else {
        _logf(LOG_ALERT, "LOG %s (%s) - %s:%d", __FILE__, __LINE__, __func__, "TCP bind success");  
    }
}

int main(int argc, char **argv)
{
    if (sysconf() == -1) {
        exit(-1);   
    }

    sysinit();

    if (parse_options(argc, argv) == -1) {
        usage();
        exit(1);
    }

    connect_to_server();
}

Сообщение об ошибке:

Sep 10 10:59:21 michael-VirtualBox mld: LOG mld.c:685 (connect_to_server) - tcp_bind failed, error:Cannot assign requested address

person TomSelleck    schedule 10.09.2013    source источник


Ответы (1)


Вы можете привязать сокет только к адресу локального интерфейса.

person alk    schedule 10.09.2013
comment
Обычно да. Одно уточнение: в Linux также можно привязывать многоадресные адреса. - person Yury Schkatula; 10.09.2013
comment
Я не понимал, что пытаюсь подключиться к удаленному порту, спасибо! - person TomSelleck; 10.09.2013
comment
Хотя tproxy поддерживается, вы действительно можете привязать удаленный адрес. - person coanor; 13.12.2013
comment
Оказывается, верно и для UDP (SOCK_DGRAM). Бесконечно благодарен! - person jacknad; 31.08.2016