2011-05-06 6 views
2

UDP 소켓을 사용하여 C++ 클라이언트에서 C# 서버로 데이터를 전송하고 있습니다. 그러나 클라이언트에서 처음 전송 된 후 UDP 클라이언트 소켓이 작동을 멈추었습니다!UDP가 처음으로 전송을 중단합니다.

클라이언트 소켓 만 중지하면 서버가 normaly 데이터를 보냅니다.

문제가 없습니다.

클라이언트 C++ :가는 요리 -1 후에게 먼저 보내된다

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

확인

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); 

전송 코드!

서버 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

죄송합니다. Bitetti, 저는 여러분의 질문을 누구나 이해할 수 있다고 생각하지 않습니다. – Jay

+0

귀하의 고객이 전화를 전혀받지 않고 있습니다. – Omnifarious

+0

그리고이 컨 피규 레이터는 무엇입니까? –

답변

0

감사합니다! 너없이 내가 풀지 않았을거야.

오류 여기

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

데이터 receivement의 메인 루프이다. 프로세스에 오류 메시지를 추가 한 후. 버퍼의 길이 (recBuf)로 오류를 제한합니다. 512 바이트에서 65546 바이트로 넘어 가면 충돌이 종료됩니다.

관련 문제