UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,它不保证数据包的顺序和可靠性,但具有较低的延迟和较高的传输效率。UDP适用于对实时性要求较高的应用,如音视频传输、在线游戏等。
UDP协议本身没有类型之分,但在实际应用中,可以根据数据包的处理方式分为单播、广播和组播。
以下是一个简单的Linux下使用C语言实现UDP收发包的例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define BUF_SIZE 30
int main(int argc, char *argv[]) {
int send_sock;
struct sockaddr_in send_addr;
char buf[BUF_SIZE];
if (argc != 3) {
printf("Usage: %s<IP> <port>\n", argv[0]);
exit(1);
}
send_sock = socket(PF_INET, SOCK_DGRAM, 0);
if (send_sock == -1) {
perror("socket() error");
exit(1);
}
memset(&send_addr, 0, sizeof(send_addr));
send_addr.sin_family = AF_INET;
send_addr.sin_addr.s_addr = inet_addr(argv[1]);
send_addr.sin_port = htons(atoi(argv[2]));
while (1) {
printf("Enter message: ");
fgets(buf, BUF_SIZE, stdin);
buf[strcspn(buf, "\n")] = 0; // Remove newline character
if (sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&send_addr, sizeof(send_addr)) == -1) {
perror("sendto() error");
exit(1);
}
}
close(send_sock);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define BUF_SIZE 30
int main(int argc, char *argv[]) {
int recv_sock;
struct sockaddr_in recv_addr;
socklen_t addr_size;
char buf[BUF_SIZE];
if (argc != 2) {
printf("Usage: %s <port>\n", argv[0]);
exit(1);
}
recv_sock = socket(PF_INET, SOCK_DGRAM, 0);
if (recv_sock == -1) {
perror("socket() error");
exit(1);
}
memset(&recv_addr, 0, sizeof(recv_addr));
recv_addr.sin_family = AF_INET;
recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
recv_addr.sin_port = htons(atoi(argv[1]));
if (bind(recv_sock, (struct sockaddr*)&recv_addr, sizeof(recv_addr)) == -1) {
perror("bind() error");
exit(1);
}
addr_size = sizeof(recv_addr);
while (1) {
int recv_len = recvfrom(recv_sock, buf, BUF_SIZE, 0, (struct sockaddr*)&recv_addr, &addr_size);
if (recv_len == -1) {
perror("recvfrom() error");
exit(1);
}
buf[recv_len] = 0;
printf("Received message: %s\n", buf);
}
close(recv_sock);
return 0;
}
gcc -o sender sender.c
gcc -o receiver receiver.c
./receiver 8888
./sender 127.0.0.1 8888
netstat -an | grep <port>
检查端口状态。通过以上示例和解释,你应该能够理解Linux下UDP收发包的基本概念和实现方法。
领取专属 10元无门槛券
手把手带您无忧上云