gpt4 book ai didi

c# - C#在UDP上接收到的数据总是无用的

转载 作者:行者123 更新时间:2023-12-03 11:58:15 30 4
gpt4 key购买 nike

这是我的问题;我正在尝试制作UDP服务器-客户端交互作为测试。我希望客户端将数据发送到服务器,并且如果服务器与服务器保存的数据匹配,它将发送答复。简单吧?这是一些代码:

客户端发送/接收代码:

void TestUDP()
{
Socket sock_addr = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint srver_endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 36);
string numbers = "1.2.3.4";
byte[] srver_req = Encoding.UTF8.GetBytes("TEST|" + numbers);

sock_addr.SendTo(srver_req, srver_endpoint);

EndPoint ref_endpoint = (EndPoint)srver_endpoint;
byte[] req_reply = new byte[1000];
sock_addr.ReceiveFrom(req_reply, ref ref_endpoint);

string reply = Encoding.UTF8.GetString(req_reply).Trim();

string[] s_str = reply.Split('|');

if (s_str[0] == "HEY")
{
MessageBox.Show("HEY");
}
else
{
MessageBox.Show("NO");
}
}

现在,一些服务器代码:
public void start()
{
udp_sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udp_sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);

udp_thr = new Thread(udpListen);
udp_thr.Start();
}

void udpListen()
{
byte[] data = new byte[1024];
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 36);

udp_sock.Bind(ip);

IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);

while (true)
{
udp_sock.ReceiveFrom(data, ref Remote);

Parse(data, Remote);
}
}

void Parse(byte[] data, EndPoint Remote)
{
string decData = Encoding.UTF8.GetString(data).Trim();
string[] s_str = decData.Split('|');
byte[] sendBuffer = new byte[] { };

switch (s_str[0])
{
case "TEST":
string data1 = s_str[1];

if (data1 == "1.2.3.4")
{
sendBuffer = Encoding.UTF8.GetBytes("HEY|");
}
else if(data1 != "1.2.3.4")
{
sendBuffer = Encoding.UTF8.GetBytes("NO|");
}

udp_sock.SendTo(sendBuffer, Remote);
break;
}
}

现在的问题是,它总是说“不”,我不知道为什么。对我来说,这看起来应该可行,我在做什么错呢?
我已将此套接字放置到Bro​​adcast上,因为我也想与此一起处理Broadcast请求。那是问题吗?

最佳答案

首先,您应该添加诊断信息以打印出实际数据,而不是仅仅知道其“正确”或“错误”。

接下来,实际的问题是您忽略了udp_sock.ReceiveFrom的结果。这将告诉您实际上已接收了多少个字节。当前,您总是将所有1024个字节转换为字符串...这意味着您可能会拥有刚刚收到的尾随数据。仅使用Trim()并不是解决该问题的好方法。 Trim()不会将U + 0000视为空格,即使这样做,也不是一种合适的方法-除了其他功能,您稍后将重用相同的缓冲区,因此,如果收到长消息,然后短一点的,你最终会混合在一起。

你要:

// TODO: Fix your variable names, which are inconsistent non-idiomatic
int bytesRead = udp_sock.ReceiveFrom(data, ref Remote);
Parse(data, bytesRead, Remote);

并将 Parse更改为:
void Parse(byte[] data, int bytesRead, EndPoint remote)
{
string text = Encoding.UTF8.GetString(data, 0, bytesRead);
...
}

您需要在客户端和服务器上都执行此操作。

同样,假设 if/ else的第一个分支检查 data1是否为“1.2.3.4”,则无需检查它是否为“1.2.3.4”。

关于c# - C#在UDP上接收到的数据总是无用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19063874/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com