2011-05-06 3 views
2

Я использую сокет UDP для передачи данных с клиента C++ на сервер C#. Но, после первой передачи с клиента, клиентский сокет UDP должен был прекратить работу!UDP прекращает отправку после первого раза

Только только клиентский сокет останавливается, сервер отправляет данные normaly.

Я не вижу проблемы.

клиент C++:

unsigned char IPv4[4]; 
if (getMyIp(IPv4)) 
{ 
    char strIP[256]; 
    sprintf(strIP,"%i.%i.%i.%i", (int) IPv4[0], (int) IPv4[1], (int) IPv4[2], (int) IPv4[3]); 
    strcpy(Configurator::LOCAL_IP, strIP); 
    //std::cout<<"IP: "<<strIP<<"\n"; 

    // Open windows connection 
    conectado = false; 

    if(WSAStartup(MAKEWORD(2,2),&WsaDat)!=0) 
    { 
     messagelog("Winsock error - Winsock initialization failed"); 
     WSACleanup(); 
     return 0; 
    } 

    //Open a datagram socket 
    Socket = socket(AF_INET, SOCK_DGRAM, 0); 
    if (Socket == INVALID_SOCKET) 
    { 
     messagelog("Could not create socket.\n"); 
     WSACleanup(); 
     return 0; 
    } 

    //options 

    #ifndef IP_MULTICAST_TTL 
     #define IP_MULTICAST_TTL 3 
    #endif 
    #ifndef IP_MULTICAST_LOOP 
     #define IP_MULTICAST_LOOP 4 
    #endif 
    unsigned char one = 1; 
    unsigned char ttl = 3; 
    setsockopt(Socket, IPPROTO_IP, IP_MULTICAST_TTL, (const char*) &ttl, 
      sizeof(unsigned char)); 
    setsockopt(Socket, IPPROTO_IP, IP_MULTICAST_LOOP, 
        (const char*) &one, sizeof(unsigned char)); 

    // Clear out server struct 
    memset((void *)&SockAddr, '\0', sizeof(struct sockaddr_in)); 

    // Set family and port 
    SockAddr.sin_family = AF_INET; 
    SockAddr.sin_port = htons(Configurator::PORT); //porta 
    SockAddr.sin_addr.s_addr = inet_addr(Configurator::IP /*strIP*/); // ip local 

    // Clear out client struct 
    memset((void *)&SockAddrClient, '\0', sizeof(struct sockaddr_in)); 
    // Set family and port 
    SockAddrClient.sin_family = AF_INET; 
    SockAddrClient.sin_port = htons(0); 
    SockAddrClient.sin_addr.s_addr = inet_addr(strIP); // ip local // htonl(INADDR_ANY); 

    if (bind(Socket, (struct sockaddr *)&SockAddrClient, sizeof(struct sockaddr_in)) == -1) 
    { 
     messagelog("Cannot bind address to socket."); 
     WSACleanup(); 
     return 0; 
    } 
    server_length = sizeof(struct sockaddr_in); 

отправить код

int ok = sendto(Socket, mensagem, (int)strlen(mensagem) + 1, 0, (struct sockaddr *)&SockAddr, server_length); 
    std::cout<<ok<<"\n"; 

ОК Визитки -1 после первой отправки!

сервер C#:

System.Net.IPEndPoint ip = new System.Net.IPEndPoint(System.Net.IPAddress.Any, PORT); 
     conn = new System.Net.Sockets.Socket(
      System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); 
     conn.MulticastLoopback = true; 

     conn.Bind(ip); 

     sender = new System.Net.IPEndPoint(System.Net.IPAddress.Any,0); 
     remote = (System.Net.EndPoint)(sender); 
     System.Console.WriteLine("udp " + PORT); 

получить:

int res = conn.ReceiveFrom(b, ref Connector.instance.remote); 
+0

извините Биттти, я не думаю, что кто-то может понять ваш вопрос. – Jay

+0

Я не вижу, что вы вообще совершаете любые звонки в своем клиенте. – Omnifarious

+0

И что это за конфигуратор? –

ответ

0

Спасибо за все комментарии! Без тебя я бы не решил.

ошибка здесь

//recebe via UDP 
inDataLength = recvfrom(Socket, recBuf, BUFFDERECEBIMENTO_SIZE, 0, (struct sockaddr *)&SockAddrClient, &server_length); 

Основной цикл receivement данных. После добавления сообщения об ошибке в процесс. Я ограничиваю ошибку длиной буфера (recBuf). После прохождения от 512 байт до 65546 байтов завершается сбой.

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