首页 > 解决方案 > 每次发送数据包后,我添加了Thread.sleep(1),为什么udp的丢包率下降了?

问题描述

UDP 服务器

#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define PORT 10086

int main() {
    int server_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (server_fd < 0) {
        perror("create socket");
        _exit(2);
    }

    int ret;
    struct sockaddr_in s_addr;
    s_addr.sin_family = AF_INET;
    s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    s_addr.sin_port = htons(PORT);
    ret = bind(server_fd, (struct sockaddr *) &s_addr, sizeof(s_addr));
    if (ret < 0) {
        perror("bind error");
        _exit(2);
    }
    for (;;) {
        struct sockaddr_in c_addr;
        socklen_t c_addr_len;
        char buf[100];
        int ret = recvfrom(server_fd, buf, 100, 0, (struct sockaddr *) &c_addr, &c_addr_len);
        if (ret < 0) {
            perror("accept error");
            _exit(2);
        } else {
            char temp[100];
            char *host2 = inet_ntoa(c_addr.sin_addr);
            printf("A client connect: %d, %s, %d with msg: %s.\n", c_addr.sin_port, host2, c_addr.sin_family, buf);
        }
    }
}

服务器监听 10086,recvfrom 一个 udp 数据包,打印客户端 IP、端口和数据。

这是客户端代码:


    public static void main(String[] args) throws IOException {
        String server = "192.168.1.5";
        DatagramSocket ds = new DatagramSocket();
        byte[] data = "Hello".getBytes();
        DatagramPacket p = new DatagramPacket(data, data.length);
        p.setAddress(InetAddress.getByName(server));
        p.setPort(10086);
        ds.send(p);
        data = "world".getBytes();
        p = new DatagramPacket(data, data.length);
        p.setAddress(InetAddress.getByName(server));
        p.setPort(10086);
        ds.send(p);
    }

运行客户端后,我得到服务器输出(测试了几次,相同的输出)

A client connect: 38394, 192.168.1.2, 2 with msg: Hello.

在我Thread.sleep(1);向服务器发送“Hello”之后添加。

    public static void main(String[] args) throws IOException, InterruptedException {
        DatagramSocket ds = new DatagramSocket();
        byte[] data = "Hello".getBytes();
        DatagramPacket p = new DatagramPacket(data, data.length);
        String server = "192.168.1.5";
        p.setAddress(InetAddress.getByName(server));
        p.setPort(10086);
        ds.send(p);
        Thread.sleep(1);
        data = "world".getBytes();
        p = new DatagramPacket(data, data.length);
        p.setAddress(InetAddress.getByName(server));
        p.setPort(10086);
        ds.send(p);
    }

运行客户端后,我得到服务器输出(测试了几次,相同的输出)

A client connect: 38394, 192.168.1.2, 2 with msg: Hello.
A client connect: 38394, 192.168.1.2, 2 with msg: world.

我用Wireshark检查了一下,没问题。我还检查了套接字读取缓冲区,没关系。那么这里为什么会出现丢包呢?应该没有缓冲区溢出,网络环境也没有那么差。UDP数据包丢失还有其他原因吗?提前致谢。

标签: udp

解决方案


推荐阅读