我正在尝试创建一个 UDP 服务器,它可以向所有向其发送消息的客户端发送消息。真实情况要复杂一些,但最简单的方法是将其想象为一个聊天服务器:之前发送过消息的每个人都会收到其他客户端发送的所有消息。
所有这些都是通过UdpClient
单独的进程完成的。(虽然所有网络连接都在同一个系统内,所以我不认为UDP 的不可靠性不是问题。)
服务器代码是这样的循环(稍后提供完整代码):
var udpClient = new UdpClient(9001);
while (true)
{
var packet = await udpClient.ReceiveAsync();
// Send to clients who've previously sent messages here
}
Run Code Online (Sandbox Code Playgroud)
客户端代码也很简单 - 同样,这稍微缩写了,但稍后是完整的代码:
var client = new UdpClient();
client.Connect("127.0.0.1", 9001);
await client.SendAsync(Encoding.UTF8.GetBytes("Hello"));
await Task.Delay(TimeSpan.FromSeconds(15));
await client.SendAsync(Encoding.UTF8.GetBytes("Goodbye"));
client.Close();
Run Code Online (Sandbox Code Playgroud)
这一切都工作正常,直到其中一个客户端关闭它UdpClient
(或进程退出)。
下次另一个客户端发送消息时,服务器会尝试将其传播到现已关闭的原始客户端。对此的调用SendAsync
不会失败 - 但是当服务器循环回到 时ReceiveAsync
,会因异常而失败,并且我还没有找到恢复的方法。
如果我从不向已断开连接的客户端发送消息,我就永远不会发现问题。基于此,我还创建了一个“立即失败”重现,它仅发送到假设没有监听的端点,然后尝试接收。这会失败并出现相同的异常。
例外:
System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host.
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, …
Run Code Online (Sandbox Code Playgroud) 我想知道我是否可以为UdpClient接收方法设置超时值.
我想使用块模式,但因为有时udp会丢失数据包,我的程序udpClient.receive将永远挂在那里.
我有什么好主意可以管理它?
我正在寻找通过UdpClient
课程接收和处理消息的最佳解决方案C#
.有没有人有这方面的解决方案?
我能够通过UDP套接字正确地发送我的数据,但是当我收到数据时,它一直在等待接收命令我不知道是什么导致这个.请看下面的代码.
我能够从Android设备正确接收服务器端的数据,但是当我从服务器端向Android设备发送数据时,它无法接收.但是当我从服务器向任何其他客户端(例如PC应用程序)发送数据时,它会正确接收和显示数据
class Task implements Runnable {
@Override
public void run() {
try {
String messageStr = "feed";
int server_port = 8888;
InetAddress local = InetAddress.getByName("10.0.2.2");
int msg_length = messageStr.length();
byte[] message = messageStr.getBytes();
DatagramSocket s = new DatagramSocket();
//
DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port);
s.send(p);//properly able to send data. i receive data to server
for (int i = 0; i <= 20; i++) {
final int value = i;
message = new byte[30000];
p = new …
Run Code Online (Sandbox Code Playgroud) 任何人都可以告诉我如何在UDP套接字中设置源端口地址吗?我的客户端应用程序需要将数据包从57002端口发送到服务器端口58007.
我需要向特定的IP和端口发送UDP消息.
由于有3张网卡,
10.1.x.x
10.2.x.x
10.4.x.x
Run Code Online (Sandbox Code Playgroud)
当我发送UDP消息时,我只在一个网络适配器中收到消息...其余的ip没有收到.
我想在发送消息时检查网络适配器.我怎样才能做到这一点?
目前我正在使用以下内容:
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(LocalIP), 0);
IPEndPoint targetEndPoint = new IPEndPoint(TargetIP, iTargetPort);
UdpClient sendUdpClient = new UdpClient(localEndPoint);
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
Run Code Online (Sandbox Code Playgroud) 我试图在特定端口通过UDP向服务器发送字符串HI,然后接收响应.但是,在我尝试使用recvfrom()获取响应后,我陷入阻塞状态.我尝试使用连接的UDP,但我得到:
在UDP中接收错误:连接被拒绝
可能是什么原因?服务器不在我的控制之下,但我知道它工作正常.
我添加了代码
int sockfdudp;
char bufudp[MAXDATASIZE], port[6];
struct addrinfo hints, *servinfo, *p;
struct sockaddr_storage addr;
int rv;
char s[INET6_ADDRSTRLEN];
int bytes_recv, bytes_sent;
socklen_t len;
scanf("%s",port);
printf("UDP Port: %s \n", port);
// Start connecting to datagram server
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
if ((rv = getaddrinfo(SERVER_NAME, port, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
// loop through all the results and make a socket
for(p = servinfo; p != …
Run Code Online (Sandbox Code Playgroud) 我想将UdpPacket发送到特定的远程主机(我已经知道公共IP和端口).我想使用C#的UdpClient类.
static int Main()
{
UdpClient client = new UdpClient();
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("1.2.3.4"), 9999);
byte[] data = GetData();
client.Send(data, data.Length, remoteEP);
}
Run Code Online (Sandbox Code Playgroud)
发送数据包时,UdpClient会自动选择可用端口.我想手动设置端口,从中发送数据包.
感谢您的帮助!
我已经计算出使用udp的2个端点之间的碎片之前的最大数据是1472(其他端点可能不同).这表明mtu是1500字节,每个数据包的头开销是28bytes.可以安全地假设如果我发送0字节数据(有效载荷),传输的实际数据是28字节?我正在做一些bencchmark,所以对我来说知道频道中发生了什么至关重要.谢谢.
请...任何帮助将不胜感激!
这是我的代码:
static void Main(string[] args)
{
IPEndPoint localpt = new IPEndPoint(IPAddress.Any, 6000);
UdpClient udpServer = new UdpClient(localpt);
udpServer.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
UdpClient udpServer2 = new UdpClient();
udpServer2.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer2.Client.Bind(localpt); // <<---------- Exception here
}
Run Code Online (Sandbox Code Playgroud) udpclient ×10
c# ×7
udp ×6
sockets ×3
c ×2
android ×1
header ×1
java ×1
multihomed ×1
networking ×1
packet ×1
port ×1
reusability ×1
timeout ×1