Как исправить «Не удается назначить запрошенный адрес?»

c++ sockets udp ip bind

8759 просмотра

1 ответ

5866 Репутация автора

И IP-адрес, и порт подтверждены как неиспользуемые. netstat -a -n.Когда я использую gdb и перерываю в вызове метода связывания, я вижу, что используются правильный IP-адрес и порт вместе с разумной длиной адреса сокета 16. Это для прослушивателя UDP , Удаленный IP-адрес является статическим и считывается из файла конфигурации.

Это код,

void CSocket::Bind(IpEndPoint& endPoint)
{
    int bindResult = bind( socketHandle, endPoint.GetSockAddrPtr(), 
        endPoint.GetAddrLength());
    if(bindResult < 0)
    {
        TRACE_ERROR("Failed to bind to socket. %s. IpAddress %s Port %d AddrLength %d",
            strerror(errno), endPoint.GetIpAddressString(), 
            ntohs(endPoint.GetPort()), endPoint.GetAddrLength());

это из GDB,

Точка останова 1, CSocket :: Bind (this = 0x819fa24, ipAddress = "192.0.2.77", port = 4185) в Socket.cpp: 126

и это TRACE_ERROR из кода выше

ОШИБКА: не удалось привязать к сокету. errno 99 (Невозможно назначить запрошенный адрес). IpAddress 192.0.2.77 Port 4185 AddrLength 16

Я перечитывал Руководство Биджа по сетевому программированию, но не нашел подсказки. Это UDP, поэтому соединение не должно требовать привязки. Брандмауэр выключен. Где еще я должен искать?

Автор: jacknad Источник Размещён: 18.07.2016 03:57

Ответы (1)


1 плюс

9415 Репутация автора

Решение

Следуя сказанному @Aconcagua: вы хотите связать локальный адрес (а не тот, который «не используется»). Вы не можете просто составить местный адрес. Вы либо используете INADDR_ANYдля привязки к любому адресу, либо вам нужно привязать тот, который назначен одному из ваших локальных интерфейсов. Это скорее всего проблема. ( bindустанавливает локальный адрес, connectустанавливает удаленный адрес - или, с помощью UDP, вы можете указать удаленный адрес для пакета с помощью sendto.) - Джил Гамильтон

Автор: Armali Размещён: 01.08.2016 06:54
Вопросы из категории :
32x32