2

プログラムの 1 つで少し問題が発生しました。これがどのように機能するかは次のとおりです。

  1. C# クライアントがデータを Java サーバーに送信する
  2. Javaサーバーがデータをチェック
  3. Java サーバーがコマンドを C# クライアントに送り返す
  4. C# クライアントはデータを受信し、ユーザーがログインまたは登録できるようにします

ステップ3まではなんとかたどり着いたのに、ステップ4で行き詰ってしまいました。

サーバー、クライアント、サーバーで Wireshark を実行しました。すべてのパッケージが正しく出入りしています。サーバーは 1 つのパケットを受信し、1 つを送信します。クライアントは 1 つを渡し、1 つを受け取ります。ただし、コンソールで netstat を確認すると、開いているポートが表示されません。実際、UDP ソケットはまったく表示されません。パケットが入ってくるのに、C# クライアントがリッスンしていないように見えるのはなぜですか?

これが C# クライアントです。

// Opening a socket with UDP as Protocol type
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// The address of the server
IPAddress[] address = Dns.GetHostAddresses("192.168.0.87");
// The Endpoint with the port
IPEndPoint endPoint = new IPEndPoint(address[0], 40001);

// Defining the values I want
string values = "Something I send here";
// Encoding to byte with UTF8
byte[] data = Encoding.UTF8.GetBytes(values);

// Sending the values to the server on port 40001
socket.SendTo(data, endPoint);

// Showing what we sent
Console.WriteLine("Sent: " + values);

// Timeout for later, for now I just let the program get stuck
// socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000);

// Allowing the response to come in from everywhere
EndPoint response = new IPEndPoint(IPAddress.Any, 0);
// Buffer for server response (currently bigger then actually necessary for debugging)
byte[] responseData = new byte[1024];

//Receiving the data from the server
socket.ReceiveFrom(responseData, ref response);

// Outputing what we got, we don't even get here
Console.WriteLine("You got: " + Encoding.UTF8.GetString(responseData));

// Closing the socket
socket.Close();

デバッグのために、ユーザーが正常に認証された場合、文字列「Test」を送り返したいと思います。

Javaサーバーはこちら

// Printing to the server that the user username logged in successfully
System.out.println("User " + username + " logged in succesfully!");

// The byte buffer for the response, for now just Test
byte[] responseData = "Test".getBytes("UTF-8");
// The Datagram Packet, getting IP from the received packet and port 40001
DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, receivePacket.getAddress(), 40001);
// Sending the response, tried putting Thread.sleep here didn't help
serverSocket.send(responsePacket);

受信部分で C# クライアントに何か問題があったと思いますが、何かわからない、アイデアや提案はありますか?

4

2 に答える 2

2

問題ではないかもしれませんが、通常、UDP 応答は元の要求の発信元 (ソース) ポートに送り返されます。応答を固定ポートに送り返しています。Javaビットを次のように変更してみてください:

DatagramPacket responsePacket = new DatagramPacket(responseData, 
     responseData.length, receivePacket.getAddress(), receivePacket.getPort());
于 2012-05-04T07:38:13.830 に答える
1

クライアントソケットでのBindの呼び出しが欠落していると思います。

// Allowing the response to come in ON port 40001
EndPoint response = new IPEndPoint(IPAddress.Any, 40001);

socket.Bind(response);  // bind to port 40001 on some local address
于 2012-05-04T14:40:00.613 に答える