C# UDP Socket 不监听响应?

标签 c# java udp client

我的一个程序遇到了一点问题。 它应该是这样工作的:

  1. C# 客户端向 Java 服务器发送数据
  2. Java服务器检查数据
  3. Java 服务器将命令发送回 C# 客户端
  4. C# 客户端接收数据并使用户能够登录或注册

我设法完成了第 3 步,但现在我陷入了第 4 步。

我在服务器、客户端和服务器上运行 Wireshark。 所有包裹均正确进出。 服务器接收一个数据包并发出一个数据包。 客户发出一份并收到一份。 但是,如果我在控制台中检查 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# 客户端出了问题,但不确定是什么,有什么想法或建议吗?

最佳答案

也许不是问题,但通常 UDP 响应会发送回原始请求的原始(源)端口。您将响应发送回固定端口。您可以尝试将 Java 位更改为:

DatagramPacket responsePacket = new DatagramPacket(responseData, 
     responseData.length, receivePacket.getAddress(), receivePacket.getPort());

关于C# UDP Socket 不监听响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10443059/

相关文章:

java - 在 Java 内部启动外部应用程序

java - Storm DRPC 中的更新与请求-回复

java - 哪个是按顺序发送大型 UDP 数据包的最佳方法

c# - 从程序集中获取所需的运行时版本

c# - 哈希集的浅拷贝

java - 在android中执行管道命令

network-programming - 用于 Java 和 Objective-C 游戏的实时游戏网络库

tcp - 源端口低于 1024 的 TCP/UDP IP 数据包是否可能

c# - Unity WaitForSeconds 不工作 c#

C# 读取 .txt 文件格式化