udp - 每次发送数据包后,我添加了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数据包丢失还有其他原因吗?提前致谢。
解决方案
推荐阅读
- java - 如何使用 PdfBox 删除可选内容组 (OCG)
- python - 在逻辑函数的 MLE 估计中,在牛顿拉夫森的实现中反复出现“奇异矩阵”的错误
- r - 如何将未定义数量的ggplot项目放入网格中
- java - 将 Collection 与 ReplyingKafkaTemplate 一起使用时,相关 ID 丢失
- python-3.x - 如何为大量文本创建字典并列出最常用的单词?
- go - 尝试重新创建 Web 服务的模拟版本
- javascript - 使用 iframe 嵌入有哪些陷阱
- redis - Redis 缓存包含 200 万行的表
- python - 设置要在线程完成时执行的行为
- java - 杰克逊反序列化字符串失败