Не удается связать сокет TCP с локальным IP

Моя серверная программа нормально привязывается к 0.0.0.0 (INADDR_ANY) или 127.0.0.1 (INADDR_LOOPBACK), однако я хочу, чтобы программа прослушивала мой IP-адрес в локальной сети (192.168.1.24), и я продолжаю получать эту ошибку:

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

Вот соответствующий код:

#define LOCAL_IP ((unsigned long int) 0x1801A8C8) //192.168.1.24
#define PORT 8888

struct sockaddr_in sa;

sa.sin_family = AF_INET;
sa.sin_port = htons(PORT);
sa.sin_addr.s_addr = LOCAL_IP; /* Bind servers to local net*/
//sa.sin_addr.s_addr = htonl(INADDR_ANY);

Я также пробовал htonl(LOCAL_IP) и inet_addr("192.168.1.24") безуспешно.


person tozhan    schedule 31.03.2014    source источник
comment
какая ОС? у вас есть брандмауэр или аналогичная система безопасности?   -  person an earwig    schedule 31.03.2014
comment
Что не так с INADDR_ANY?   -  person user207421    schedule 31.03.2014
comment
Ага, это C0, а не C8!! Спасибо, я действительно должен был заметить эту ошибку. Исправлено сейчас! Спасибо.   -  person tozhan    schedule 31.03.2014


Ответы (2)


Используемый вами IP-адрес: 200.168.1.24.

Использовать:

sa.sin_addr.s_addr = inet_addr("192.168.1.24");

вместо.
Убедитесь, что порт еще не используется. (используйте программу netstat) Правильно ли вы закрыли сокет, на тестах ранее?

person robin.koch    schedule 31.03.2014
comment
s_addr сеть принимает долго. так что обратный шестнадцатеричный адрес в порядке, ошибка была C8 = 200, когда я должен был иметь C0 = 192. Спасибо, что указали на это! - person tozhan; 31.03.2014

вы не можете назначить какую-либо строку или целое число для sa.sin_addr.s_addr.

Поэтому вам нужно привести его в подходящий формат. Заявление, которое вы написали sa.sin_addr.s_addr = LOCAL_IP, будет заменено на

sa.sin_addr.s_addr =192.168.1.24

Что вызывает проблему.

Вместо этого используйте inet_addr(LOCAL_IP), это должно сработать.

person User007    schedule 31.03.2014