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

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

2 голосов
/ 12 ноября 2009

Я пытался сделать это в MS Visual Studio 2008, используя пакет winsock2, но всякий раз, когда я пытаюсь разрешить входной IP-адрес, который действителен, я получаю ошибку «Invalid 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);
    }
}

Ответы [ 4 ]

4 голосов
/ 12 ноября 2009

Вам необходимо связать с ws2_32.lib:

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

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

2 голосов
/ 12 ноября 2009

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

1 голос
/ 14 ноября 2009

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

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

1 голос
/ 14 ноября 2009

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

if (WSAStartup (MAKEWORD (2,0), & wsaData)! = 0) {

до

if (WSAStartup (MAKEWORD (2,2), & wsaData)! = 0) {

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...