如何优化用于数据包转发的 UDP 套接字

问题描述 投票:0回答:1

我正在通过使用 UDP 套接字进行数据包转发。该设置基于将数据包发送到 UDP 套接字的流量生成器,UDP 套接字然后简单地切换源地址和目标地址并将数据包发送回数据包的来源(流量生成器),然后一些网络指标记录。

我已经尝试为此创建最简单的应用程序,它能够在流量生成器每秒向 UDP 套接字发送大约

350 000
数据包时向流量生成器发送回大约
5 000 000
数据包/秒。因此,似乎应该有一些改进的余地。

这是用于回显数据包的 UDP 套接字代码。

#define PORT 12345
#define IP_ADDR "192.168.0.32"

int main(int argc, char *argv[]){
    int socket_fd;
    struct sockaddr_in address, send_address;
    char packet_buffert[2000] = {0};

    if ((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = inet_addr(IP_ADDR);

    if(bind(socket_fd, (struct sockaddr*)&address, sizeof(address))<0){
        return -1;
    }

    socklen_t s = sizeof(send_address);

    while(1){

        if (recvfrom(socket_fd, packet_buffert, sizeof(packet_buffert), 0,(struct sockaddr*)&send_address, (socklen_t*)&s) < 0)
        {
             return -1;
        } 

        if (sendto(socket_fd, packet_buffert, sizeof(packet_buffert), 0, (struct sockaddr*)&send_address, (socklen_t)sizeof(send_address)) < 0)
        {
            return -1;
        }
    } 
    return 0;
} 

可以对 UDP 套接字进行哪些更改以提高或优化吞吐量,从而实现更高的数据包/秒?这个实现是否遗漏了一些可以提高网络性能的重要概念?

到目前为止,我的想法是是否以及如何完成批处理数据包。我还注意到,当数据包缓冲区设置为

2000
时,它会产生一种情况,当套接字接收到
64
字节的数据包时,它会发回比
64
字节大很多的数据包。

c sockets networking udp
1个回答
0
投票

在担心优化之前,您应该确定您的代码是否没有错误——事实并非如此。

while(1){

        if (recvfrom(socket_fd, packet_buffert, sizeof(packet_buffert), 0,(struct sockaddr*)&send_address, (socklen_t*)&s) < 0)
        {
             return -1;
        } 

        if (sendto(socket_fd, packet_buffert, sizeof(packet_buffert), 0, (struct sockaddr*)&send_address, (socklen_t)sizeof(send_address)) < 0)
        {
            return -1;
        }
    } 

您的生成器是否发送 2000 字节的消息?因为你要发送 2000 字节的回复,无论传入消息的长度如何。 – 约翰博林格

recvfrom(2)
返回接收到的字节数;将其用作
sendto(2)
.

的最后一个参数
for (;;) {
    if ((n = recvfrom (socket_fd, packet_buffert, sizeof packet_buffert, 0,(struct sockaddr*)&send_address, (socklen_t*)&s)) == -1 
        || sendto (socket_fd, packet_buffert, sizeof packet_buffert, 0, (struct sockaddr*)&send_address, n) == -1) {
        /* Perhaps log a message here? */
        return EXIT_FAILURE;
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.