如何在不丢失的情况下捕获所有 udp 消息,如 Wireshark?
How to catch all udp messages like Wireshark without drops?
我在本地主机上有两个程序 udp sender 和 consumer。发送者以最快的速度生成四个字节的 int 消息,但消费者并没有得到所有消息。消费者在 stdout 上的最后一行是
1484444 1999999
Wireshark 拦截所有包并慢慢处理它们。我怎样才能在 C 程序中获得相同的行为?
// sender.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main()
{
int sock = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in dest;
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(40500);
inet_aton("127.0.0.1", &dest.sin_addr);
int i;
for (i = 0; i < 2000000; ++i) {
sendto(sock, &i, sizeof(i), 0, (const struct sockaddr*)&dest, sizeof(dest));
}
}
// consumer.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <arpa/inet.h>
#include <stdio.h>
int main()
{
int sock = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in dest;
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(40500);
inet_aton("127.0.0.1", &dest.sin_addr);
bind(sock, (const struct sockaddr*)&dest, sizeof(dest));
int i;
int buf;
for (i = 0; i < 2000000; ++i) {
recv(sock, &buf, sizeof(buf), 0);
printf("%d %d\n", i, buf);
}
}
我认为你的问题是服务器端进程比
sender side.If 服务器的接收套接字缓冲区已满,
那么内核传递的额外数据包将被丢弃。
为了提高性能,我认为你有几件事
可以做:
1.Increase服务器端接收缓冲区。
2.Try 使用批量发送和接收接口(例如 sendmmsg()、recvmmsg())。
这将减少系统调用的开销。
3.Don不要在每次收到数据缓冲区时调用 printf()。
很费时间。
我在本地主机上有两个程序 udp sender 和 consumer。发送者以最快的速度生成四个字节的 int 消息,但消费者并没有得到所有消息。消费者在 stdout 上的最后一行是
1484444 1999999
Wireshark 拦截所有包并慢慢处理它们。我怎样才能在 C 程序中获得相同的行为?
// sender.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main()
{
int sock = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in dest;
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(40500);
inet_aton("127.0.0.1", &dest.sin_addr);
int i;
for (i = 0; i < 2000000; ++i) {
sendto(sock, &i, sizeof(i), 0, (const struct sockaddr*)&dest, sizeof(dest));
}
}
// consumer.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <arpa/inet.h>
#include <stdio.h>
int main()
{
int sock = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in dest;
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(40500);
inet_aton("127.0.0.1", &dest.sin_addr);
bind(sock, (const struct sockaddr*)&dest, sizeof(dest));
int i;
int buf;
for (i = 0; i < 2000000; ++i) {
recv(sock, &buf, sizeof(buf), 0);
printf("%d %d\n", i, buf);
}
}
我认为你的问题是服务器端进程比 sender side.If 服务器的接收套接字缓冲区已满, 那么内核传递的额外数据包将被丢弃。 为了提高性能,我认为你有几件事 可以做:
1.Increase服务器端接收缓冲区。
2.Try 使用批量发送和接收接口(例如 sendmmsg()、recvmmsg())。 这将减少系统调用的开销。
3.Don不要在每次收到数据缓冲区时调用 printf()。 很费时间。