我正在通过使用 UDP 套接字进行数据包转发。该设置基于将数据包发送到 UDP 套接字的流量生成器,UDP 套接字然后简单地切换源地址和目标地址并将数据包发送回数据包的来源(流量生成器),然后一些网络指标记录。我将 XL710 用于 40GbE,环境在计算机上,它通过内部虚拟网络发送数据
我已经尝试为此创建最简单的应用程序,它能够在流量生成器每秒向 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 ((n = recvfrom (socket_fd, packet_buffert, sizeof packet_buffert, 0,(struct sockaddr*)&traffic_gen_addr, (socklen_t*)&s)) < 0)
{
printf(" %s\n ", strerror(errno));
return EXIT_FAILURE;
}
if (sendto (socket_fd, packet_buffert, n, 0, (struct sockaddr*)&traffic_gen_addr, (socklen_t)sizeof(traffic_gen_addr)) < 0)
{
printf("%s \n", strerror(errno));
return EXIT_FAILURE;
}
}
}
到目前为止,我的想法是是否以及如何完成批处理数据包,但到目前为止我还无法正确实施。
可以对 UDP 套接字进行哪些更改以提高或优化吞吐量,从而实现更高的数据包/秒?这个实现是否遗漏了一些可以提高网络性能的重要概念?