Получение пакетов UDP в C

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

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);
    }
}

person giroy    schedule 12.11.2009    source источник


Ответы (4)


Вам нужно связать с ws2_32.lib:

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

Или поместите его в конфигурацию вашего проекта в качестве дополнительного входа компоновщика.

person Thomas    schedule 12.11.2009

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

person steveschoon    schedule 12.11.2009

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

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

to

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

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

person strangelydim    schedule 14.11.2009

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

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

person MarkR    schedule 14.11.2009