内核支持:
cat /proc/net/protocols | grep -i udp
网络接口配置:
ip link set eth0 up
ip addr add 192.168.1.100/24 dev eth0
防火墙设置:
bash
sudo iptables -A INPUT -p udp --dport 5000 -j ACCEPT
sudo iptables -A OUTPUT -p udp --sport 5000 -j ACCEPT
内核参数调优:
# 增加UDP接收缓冲区大小
sudo sysctl -w net.core.rmem_max=26214400
sudo sysctl -w net.core.rmem_default=26214400
# 增加UDP发送缓冲区大小
sudo sysctl -w net.core.wmem_max=26214400
sudo sysctl -w net.core.wmem_default=26214400
# 使配置永久生效
echo "net.core.rmem_max=26214400" | sudo tee -a /etc/sysctl.conf
echo "net.core.rmem_default=26214400" | sudo tee -a /etc/sysctl.conf
echo "net.core.wmem_max=26214400" | sudo tee -a /etc/sysctl.conf
echo "net.core.wmem_default=26214400" | sudo tee -a /etc/sysctl.conf
SO_REUSEPORT选项:
setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse))
安装必要工具:
# Debian/Ubuntu
sudo apt install build-essential net-tools tcpdump
# RHEL/CentOS
sudo yum groupinstall "Development Tools"
sudo yum install net-tools tcpdump
常用调试命令:
netstat -anu
tcpdump -i eth0 udp port 5000 -vv
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define BUFFER_SIZE 1024
#define PORT 5000
int main() {
int sockfd;
char buffer[BUFFER_SIZE];
struct sockaddr_in servaddr, cliaddr;
// 创建UDP套接字
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
// 配置服务器地址
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
// 绑定套接字
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
printf("UDP server listening on port %d...\n", PORT);
while (1) {
unsigned int len = sizeof(cliaddr);
int n = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE,
MSG_WAITALL, (struct sockaddr *)&cliaddr, &len);
buffer[n] = '\0';
printf("Received: %s\n", buffer);
// 发送响应
sendto(sockfd, (const char *)buffer, strlen(buffer),
MSG_CONFIRM, (const struct sockaddr *)&cliaddr, len);
}
return 0;
}
UDP数据包丢失:
绑定地址失败:
netstat -anu | grep 5000
性能瓶颈:
MTU问题:
通过以上配置和代码示例,您可以在Linux系统上高效地进行UDP网络编程开发。