2014-01-24 2 views
0

Я написал программу для передачи данных и для прослушивания данных через параллельный UDP. Для этого я создал несколько функций:Ошибка 10022 при прослушивании сокета UDP

int initiate_TXRX_variables(void) 
{ 
    struct hostent * hp; 
    hp = gethostbyname("localhost"); 
    if(hp == NULL) 
     return INVALID_SOCKET; 
    memset(&sa_udp_in, 0, sizeof(sa_udp_in)); 
    memset(&sa_tcp_in, 0, sizeof(sa_tcp_in)); 
    memset(&sa_udp_out, 0, sizeof(sa_udp_out)); 
    memset(&sa_tcp_in, 0, sizeof(sa_tcp_in)); 
    memcpy((char *)&sa_udp_in.sin_addr, hp->h_addr, hp->h_length); 
    memcpy((char *)&sa_tcp_in.sin_addr, hp->h_addr, hp->h_length); 
    memcpy((char *)&sa_udp_out.sin_addr, hp->h_addr, hp->h_length); 
    memcpy((char *)&sa_tcp_out.sin_addr, hp->h_addr, hp->h_length); 
    sa_udp_in.sin_family = hp->h_addrtype; 
    sa_tcp_in.sin_family = hp->h_addrtype; 
    sa_udp_out.sin_family = hp->h_addrtype; 
    sa_tcp_out.sin_family = hp->h_addrtype; 
    sa_udp_in.sin_port = htons((u_short)PORTNUM_UDP_IN); 
    sa_tcp_in.sin_port = htons((u_short)PORTNUM_TCP_IN); 
    sa_udp_out.sin_port = htons((u_short)PORTNUM_UDP_OUT); 
    sa_tcp_out.sin_port = htons((u_short)PORTNUM_TCP_OUT); 
    return 1; 
} 

int ultra_spam_network_udp(void) 
{ 
    struct hostent *hp, *local; 
    hp = gethostbyname("192.168.70.0"); 
    hp = gethostbyname("255.255.255.255"); 
    local = gethostbyname("localhost"); 
    memcpy((char *)&sa_udp_out.sin_addr,hp->h_addr, hp->h_length); 
    //set_ip_udp_out(htonl(ntohl(sa_udp_out.sin_addr.s_addr) - 1)); 
    InetPton(AF_INET, "192.168.30.0", &(sa_udp_out.sin_addr)); 
    char str[] = "Hello"; 
    char ipstr[256]; 
    for(int i = 0; i < 256; i++) 
    { 
     std::cout << "Local: " << retLocalIP() << " and current IP: " << /*inet_ntoa(sa_udp_out.sin_addr)*/InetNtop(AF_INET, &(sa_udp_out.sin_addr), ipstr, 256) << " with counter: " << i << '\n'; 
     sendto(UDP_OUT, str, sizeof(str), 0, (struct sockaddr*)&sa_udp_out, sizeof(sa_udp_out)); 
     sa_udp_out.sin_addr.s_addr = htonl(ntohl(sa_udp_out.sin_addr.s_addr)+1); 
    }; 
    //sendto(UDP_OUT, str, sizeof(str), 0, (struct sockaddr*)&sa_udp_out, sizeof(sa_udp_out)); 
    return 0; 
} 

int/*char **/ listen_udp_debug(void) 
{ 
    struct sockaddr_in from; 
    int fromlen = sizeof(from); 
    char inStr[100]; 
    char * ptr = &inStr[0]; 
    int ret = recvfrom(UDP_IN, inStr, sizeof(inStr), 0, (struct sockaddr *)&from, &fromlen); 
    std::cout << "From listen_udp_debug: " << ret << " with error number " << WSAGetLastError() << '\n'; 
    //return ptr; 
    return 0; 
} 

Я называю эти функции через

initiate_TXRX_variables(); 
    boost::thread thread_1 = boost::thread(ultra_spam_network_udp); 
    listen_udp_debug(); 

PORTNUMS для IN и OUT различны, конечно. Моя проблема в том, что я получаю ошибку 10022 при вызове listen_udp_debug(). Почему я получаю эту ошибку, и что я могу сделать, чтобы обойти это?
Большое спасибо!

+0

'char * ptr = & inStr [0];' здесь бессмысленно. У вас уже есть указатель на первый элемент массива через 'inStr' –

+0

Что такое' UDP_IN'? Как он инициализируется? –

+1

'SOCKET UDP_IN, UDP_OUT;', 'UDP_IN = socket (hp-> h_addrtype, SOCK_DGRAM, 0);', 'struct hostent * hp = gethostbyname (" localhost ");'. Я что-то забыл? –

ответ

0

Нашел мою проблему, мне пришлось использовать bind() в моей udp_receive-функции, иначе это не сработало.

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