我被告知UDP是一种无连接协议,这意味着您无法确定数据包是否能够到达目的地。
为什么执行以下操作:
var dataToSend = new byte[]{1};
UdpClient client = new UdpClient();
client.Send(dataToSend,1,"192.168.0.45", 1234);
变量LocalEndpoint初始化:
请指正,我认为变量LocalEndpoint是由路由器初始化的。原因是每当服务器(192.168.0.45)接收数据并回复时,我看到数据通过回复中的62446端口发送。
我的问题是,如果我使用UDP协议,为什么会从路由器得到响应?如果我从路由器得到响应,那就不是UDP,或者我对UDP的理解有误。我认为端口号不会随机选择。如果我已经在路由器上配置了端口转发到某台其他计算机的62446端口,则我的程序将无法工作。
以下是客户端代码:
string ipOfServer = "192.168.0.45";
int portServerIsListeningOn = 1234;
// send data to server
Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint sending_end_point = new IPEndPoint(IPAddress.Parse(ipOfServer), portServerIsListeningOn);
sending_socket.SendTo(Encoding.ASCII.GetBytes("Test"), sending_end_point);
// after I send data localendpoint gets initialized! and the server always respond through that port!
// get info
var port = sending_socket.LocalEndPoint.ToString().Split(':')[1];
// now wait for server to send data back
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, int.Parse(port));
byte[] buffer = new byte[1024];
sending_socket.Receive(buffer); // <----- keeps waiting in here :(
这是服务器端代码:
// wait for client to send data
UdpClient listener = new UdpClient(11000);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 11000);
byte[] receive_byte_array = listener.Receive(ref groupEP);
listener.Connect(groupEP);
// reply
byte[] dataToSend = new byte[] { 1, 2, 3, 4, 5 };
listener.Send(dataToSend, dataToSend.Length);