2014-12-29 7 views
1

У меня есть сокет UDP-сервера, который может получать датаграммы от клиентов, но не может отправить ответ ни одному из них.Ошибка сокета UDP 10049

Это код, который я использую для отправки буфера:

SOCKADDR_IN addr; 
    memset((char*)&addr, 0, sizeof(addr)); 

    const char* ip = "127.0.0.1"; 
    u_short port = 8888 // IP of the client to which the buffer is going to 

    if (inet_pton(AF_INET, ip, &addr) == 1) 
    { 
     addr.sin_family = AF_INET; 
     addr.sin_port = htons(port); 

     sendto(s, buffer, UDP_PACKET_SIZE, NULL, (SOCKADDR *)&addr, addrlen); 
    } 

sendto() возвращает -1 и GetLastError() говорит 10049, что означает адрес не доступен. Я отправляю и получаю буфер на localhost.

+0

Вы используете функцию [ 'inet_pton'] (http://msdn.microsoft.com/en-us/library/windows/desktop/cc805844%28v=vs.85%29.aspx) неправильно. –

+0

Я использовал то, что нашел в Интернете. Каков правильный способ его использования? – user3530012

+0

Что, если вы правильно назвали 'WSAStartup' (который мы не видим), правильно установите значение' addrlen' (которое даже не объявлено гораздо менее инициализированным) и т. Д. Извините, праздники оставили мой код- умения ясновидения немного ржавые. Сообщение * полный * код. – WhozCraig

ответ

4

Вы передаете указатель на структуру SOCKADDR_IN в качестве третьего аргумента inet_pton, но если вы будете следовать по ссылке к ссылке MSDN функции вы увидите, что он хочет IN_ADDR структуру.

В структуре SOCKADDR_IN есть такой элемент, но это не первый элемент в структуре, поэтому вы получаете ошибку; Вы пишете адрес в неправильном месте в структуре, а адрес, который вы пытаетесь отправить, - это не то, что вы думаете.

Правильный вызов будет, например.

inet_pton(AF_INET, ip, &addr.sin_addr) 
+0

Я исправил проблему. Теперь она отправляет данные, но клиент ничего не получает. – user3530012

+0

Лучше использовать 'sockaddr_in', который' recvfrom() 'предоставляет вместо создания нового' sockaddr_in' вручную. Тогда вы не столкнетесь с этой проблемой. –