2009-11-12 5 views
2

Я пытаюсь сделать это в visual studio 2008 MS, используя пакет winsock2, но всякий раз, когда я пытаюсь разрешить входной IP-адрес, который действителен, я получаю ошибку «Invalid ip ...» , Мое единственное предположение, что есть некоторая ошибка разрешений, но я действительно не знаю, что случилось. Пожалуйста помоги!Получение пакетов UDP в C

if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0){ 
    error("WSAStartup() failed\n\r"); 
} 

// validate port 
if(port <= 0 || port > 65535){ 
    sprintf(msg, "Invalid port - %d. Ports must be between 0 and 65536\n\r", 
        port); 
    error(msg); 
} 

// validate ip 
    inet_addr = inet_addr(ip); 
if(inet_addr == INADDR_NONE){ 
    sprintf(msg, "Not an ip - %s\n\r", ip); 
    error(msg); 
} else { 
     info = gethostbyaddr((char*)&inet_addr, 4, PF_INET); 
    if(info == NULL){ 
     sprintf(msg, "Invalid ip - %s\n\r", ip); 
     error(msg); 
    } 
} 

ответ

4

Вы должны связать с ws2_32.lib:

#pragma comment(lib, "ws2_32.lib") 

Или положить его в конфигурации проекта в качестве дополнительного ввода линкера.

2

Проверьте, если вы видите ссылку на ws2_32.lib. Я считаю, что это то, что вам нужно.

1

Если у вас нет веских причин оставаться на уровне совместимости Winsock 2.0 (работает на очень старой версии Windows, используя другой код, основанный на более раннем поведении Winsock и т. Д.), Вы также можете рассмотреть возможность изменения:

, если (WSAStartup (MAKEWORD (2,0), & WSADATA)! = 0) {

к

, если (WSAStartup (MAKEWORD (2,2), & WSADATA)! = 0) {

2.2 является последней версией Winsock API.

1

Номер порта sin_port также должен быть в сетевом порядке, иначе вы будете привязывать свой сокет к совершенно другому порту от того, что вы думаете. Используйте htons() и посмотрите другие примеры.

(Это применимо только к малоэтажным системам, но в любом случае это хорошая идея. Большинство систем Windows являются малоподвижными.)

Смежные вопросы