2016-01-19 2 views
0

Я пытаюсь запустить пример, демонстрирующий возможность обнаружения с помощью GSOAP. К сожалению, кажется, что я получаю -1 на setsockopt любые предложения о том, почему это может произойти? Ошибка no is invalid Аргумент.setsockopt сбой и возвращает -1

const char* host = "127.0.0.1"; 
int port = 3702; 
const int _metadataVersion = 1; 
const char* _xaddr="http://localhost/service"; 
const char* _type="\"http://schemas.xmlsoap.org/ws/2006/02/devprof\":device"; 
const char* _scope="scope"; 
const char* _endpoint="urn"; 

int main(int argc, char** argv) 
{ 
    struct soap* serv = soap_new1(SOAP_IO_UDP); 
    serv->bind_flags=SO_REUSEADDR; 
    if (!soap_valid_socket(soap_bind(serv, NULL, port, 1000))) 
    { 
     std::cout << "Error in Bind \n"; 
     soap_print_fault(serv, stderr); 
     exit(1); 
    } 
    ip_mreq mcast; 
    mcast.imr_multiaddr.s_addr = inet_addr(host); 
    mcast.imr_interface.s_addr = htonl(INADDR_ANY); 
    int res = setsockopt(serv->master, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(mcast)); 
     std::cout << "setsockopt returned " << res << "\n"; 
     if(res < 0) 
    //if (setsockopt(serv->master, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(mcast))<0) 
    { 
     std::cout << "group membership failed:" << strerror(errno) << std::endl; //The error no is invalid Argument 
     exit(1);   
    } 

    sendHello(); 
    mainloop(serv); 

    signal(SIGINT, &sighandler); 
    while (!stop) 
    { 
     mainloop(serv); 
    } 

    sendBye(); 
    mainloop(serv); 

    return 0; 
} 

ответ

1

The host = "127.0.0.1", он должен быть один действительный multicast address, от 224.0.0.0 к 239.255.255.255.


Вот три способа помочь вам в анализе этой проблемы.

  • Убедитесь, что адрес host является один действительный адрес многоадресной рассылки.

  • Используя ifconfig wlan0 или любой другой интерфейс, вы можете проверить, что MultiCast включен правильно.

  • со следующим кодом для проверки правильности адреса многоадресной рассылки.

    struct sockaddr_in sa; 
    if (-1 == inet_pton(AF_INET, host/*such as 192.0.2.33*/, &sa.sin_addr)) 
        error("cannot set multicast address: %s\n", strerror(errno)); 
    memcpy(&mreq.imr_multiaddr.s_addr, (void*)&sa.sin_addr, sizeof(struct in_addr)); 
    mreq.imr_interface.s_addr = htonl(INADDR_ANY); 
    
+0

Спасибо за очистку, что до – Rajeshwar

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