标签: udpclient

为什么通过UdpClient发送会导致后续接收失败?

我正在尝试创建一个 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)

c# udp udpclient

106
推荐指数
1
解决办法
6999
查看次数

我可以在C#中设置UdpClient的超时时间吗?

我想知道我是否可以为UdpClient接收方法设置超时值.

我想使用块模式,但因为有时udp会丢失数据包,我的程序udpClient.receive将永远挂在那里.

我有什么好主意可以管理它?

c# timeout udpclient

35
推荐指数
2
解决办法
4万
查看次数

使用udpClient连续接收消息

我正在寻找通过UdpClient课程接收和处理消息的最佳解决方案C#.有没有人有这方面的解决方案?

c# udpclient

23
推荐指数
2
解决办法
7万
查看次数

在UDP Socket java android上发送和接收数据

我能够通过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)

java sockets android udp udpclient

18
推荐指数
2
解决办法
7万
查看次数

如何在c中的UDP套接字中设置源端口?

任何人都可以告诉我如何在UDP套接字中设置源端口地址吗?我的客户端应用程序需要将数据包从57002端口发送到服务器端口58007.

c sockets udp udpclient

13
推荐指数
2
解决办法
3万
查看次数

将UDP消息广播到所有可用的网卡

我需要向特定的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)

c# udp udpclient multihomed

12
推荐指数
1
解决办法
2万
查看次数

在UDP中接收错误:连接被拒绝

我试图在特定端口通过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)

c sockets udp udpclient

12
推荐指数
2
解决办法
2万
查看次数

如何指定UdpPacket的源端口?

我想将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会自动选择可用端口.我想手动设置端口,从中发送数据包.

感谢您的帮助!

c# networking network-programming udpclient

10
推荐指数
1
解决办法
9900
查看次数

如果我在c#中发送0个有效载荷数据,udp数据包的大小是多少?

我已经计算出使用udp的2个端点之间的碎片之前的最大数据是1472(其他端点可能不同).这表明mtu是1500字节,每个数据包的头开销是28bytes.可以安全地假设如果我发送0字节数据(有效载荷),传输的实际数据是28字节?我正在做一些bencchmark,所以对我来说知道频道中发生了什么至关重要.谢谢.

c# udp header udpclient packet

10
推荐指数
3
解决办法
6万
查看次数

将两个UDP客户端连接到一个端口(发送和接收)

我尝试了这个问题的建议收效甚微.

请...任何帮助将不胜感激!

这是我的代码:

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)

c# port udpclient reusability

9
推荐指数
1
解决办法
3万
查看次数