2012-03-28 115 views
0

我有一個用C++編寫的應用程序,它使用Winsock作爲UDP客戶端。我正嘗試將數據發送到使用.Net UdpClient類在C++/CLI中編寫的另一個UDP客戶端。消息已成功發送,但從未收到。也就是說,永遠不會從監聽器中出來 - >接收(endPoint);在.NET端調用。.NET UdpClient和Winsock互操作性問題

我用C++/CLI代碼中的Winsock代替了.Net UDPClient代碼,並且沒有任何問題。

兩臺機器(在Windows 7下如此,.NET 4,以及任何WSA的版本)運行Windows 7

這裏是C++的Winsock代碼:

SOCKET jsDataSocket; 
    WSADATA WSAData; 
    string dottedInetAddress = "192.168.2.100" 
    int port = 5601; 

bool JoystickDataPublisher::socketSetup() 
{ 
    int iError; 

    // Call "WSAStartup" and display description text 
    if (iError = WSAStartup (MAKEWORD(2,2), &WSAData)) 
    { 
     OutputDebugString(L"JoystickDataPublisher - Unable to start WinSock"); 
     return false; 
    } 
    else 
     return socketSetup(); 

    int status; 

    // create UDP socket for receiving 
    jsDataSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
    if (jsDataSocket == SOCKET_ERROR) 
    { 
     OutputDebugString(L"JoystickDataPublisher - Server socket creation error\n"); 
     return false; 
    } 

bool JoystickDataPublisher::sendData(const char * buf, int size) 
{ 

    struct sockaddr_in srv_addr; 
    int status; 

    if (jsDataSocket == 0) 
    { 
     OutputDebugString(L"No socket exists yet!"); 
     return false; 
    } 

    // this is where we fill in the specific server address 
    // and port, and use our generic client socket to send 
    // a message 
    srv_addr.sin_family = AF_INET; 
    srv_addr.sin_addr.s_addr = inet_addr (dottedInetAddress.c_str()) ; 
    srv_addr.sin_port = port; 

    status = sendto(jsDataSocket, (const char *)buf, size, 0, 
     (struct sockaddr*)&srv_addr, sizeof(srv_addr)); 

    if (status != size) 
    { 
     OutputDebugString(L"Message not sent Perhaps your friend is not listening"); 
     return false; 
    } 

    return true; 
} 

這裏是.NET端:

// this code exists in a System::Threading::Thread 

    private: UdpClient^listener; 

private: void UpdateFunction() 

    listener = gcnew UdpClient(5601); 
    IPEndPoint^endPoint = gcnew IPEndPoint(IPAddress::Any,5601); 
      array<byte>^receiveData = gcnew array<byte>(1024); 
      JoystickData jsData; 

    while(1) 
    { 
    endPoint->Address = IPAddress::Any; 
    endPoint->Port = 5601; 
    try 
    { 
        **// never unblock from following call** 
     receiveData = listener->Receive(endPoint); 
    } 
    catch (SocketException^e) 
    { 
     // got here because either the Receive failed, or more 
     // or more likely the socket was destroyed by 
     // exiting from the JoystickPositionWindow form 
     Console::WriteLine(e->ToString()); 
     return; 
    } 
     Marshal::Copy(receiveData,0,(IntPtr)&jsData,sizeof(jsData)); 

        currentXRelPosition = jsData.xRelPosition; 
        currentYRelPosition = jsData.yRelPosition; 

    Invalidate(); 
     } 
     } 

回答

0

問題歸結爲端口的字節順序。在Winsock端,設置端口時,我需要使用htons(端口),如下所示:

srv_addr.sin_port = htons(port);