【问题标题】:How to catch all udp messages like Wireshark without drops?如何在没有丢包的情况下捕获所有像 Wireshark 这样的 udp 消息?
【发布时间】:2016-06-23 09:52:39
【问题描述】:

我在本地主机上有两个程序 udp 发送者和消费者。发送者以最快的速度生成四字节的 int 消息,但消费者并没有得到所有的消息。消费者标准输出的最后一行是

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);
    }
}

【问题讨论】:

    标签: c linux udp client-server wireshark


    【解决方案1】:

    我认为您的问题是服务器端进程比 发送方。如果服务器的接收套接字缓冲区已满, 那么内核传递的额外数据包将被丢弃。 为了提高性能,我认为你有几件事 可以做到:

    1.增加服务器端接收缓冲区。

    2.尝试使用批量发送和接收接口(例如sendmmsg(),recvmmsg())。 这样可以减少系统调用的开销。

    3.不要在每次收到数据缓冲区时调用 printf()。 这很耗时。

    【讨论】:

    • 增加缓冲区有帮助。 int bsize = 32000000; setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &amp;bsize, sizeof(bsize));
    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多