I have an application written in C++ that uses Winsock for a UDP client. I am trying to send data to another UDP client that is written in C++/CLI, that uses the .Net UdpClient class. The messages are successfully sent, but never received. That is, never come out of the listener->Receive(endPoint); call on the .NET side.
I replaced the .Net UDPClient code with Winsock in the C++/CLI code, and there is no problem.
Both machines are running Windows 7 (so, .NET 4, and whatever version of WSA under Windows 7)
Here is the C++ Winsock code:
    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;
 }
 Here is the .NET Side:
    // 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();
          }
       }
 
The issue came down to the byte order of the port. On the Winsock side, when setting up the port, I needed to use htons(port), as follows:
ReplyDeletesrv_addr.sin_port = htons(port);