创建一个基于UDP协议的简单传输系统,我们可以编写一个发送端程序和一个接收端程序。UDP是无连接的,这意味着发送端可以直接发送数据报而不必事先建立连接。下面是一个简单的例子,展示如何在C语言中使用UDP进行数据传输。
首先,确保你的开发环境支持socket编程,并安装了必要的库。以下是一个简单的发送端和接收端的例子。
发送端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define BUF_SIZE 1024
#define PORT 9999
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: %s <IP address> <message>\n", argv[0]);
return 1;
}
char *ip = argv[1];
char *msg = argv[2];
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if (inet_pton(AF_INET, ip, &serv_addr.sin_addr) <= 0) {
perror("Invalid address/ Address not supported");
exit(EXIT_FAILURE);
}
sendto(sock, msg, strlen(msg), MSG_CONFIRM, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
printf("Message sent: %s\n", msg);
close(sock);
return 0;
}
接收端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define BUF_SIZE 1024
#define PORT 9999
int main(void) {
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
char buffer[BUF_SIZE];
int len, addr_len;
struct sockaddr_in cli_addr;
addr_len = sizeof(cli_addr);
printf("Waiting for message...\n");
while (1) {
memset(buffer, 0, BUF_SIZE);
len = recvfrom(sock, buffer, BUF_SIZE, 0, (struct sockaddr *)&cli_addr, &addr_len);
printf("Message received from %s:%d\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));
printf("Received message: %s\n", buffer);
}
close(sock);
return 0;
}
编译与运行
- 将上述两个程序保存为
sender.c
和receiver.c
。 - 使用GCC编译它们:
gcc -o sender sender.c gcc -o receiver receiver.c
- 先启动接收端:
./receiver
- 在另一个终端窗口中启动发送端,指定接收端的IP地址和消息:
./sender <IP地址> <消息>
确保接收端已经在运行,并且发送端正确指定了接收端的IP地址。这个例子中的端口号为9999,请确保该端口在接收端的计算机上可用。如果接收端和发送端不在同一台机器上,需要替换<IP地址>
为你所使用的另一台机器的有效IP地址。
以上就是一个简单的UDP传输系统的示例代码。实际应用中,你可能需要增加错误处理机制、数据校验等功能。