创建两个文件,udp_client.c模拟客户端,udp_server.c模拟服务器端。
步骤在代码中已注释,代码如下:
头文件:
#ifndef _NET_H_
#define _NET_H_
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
客户端:
//程序功能:实现UDP通讯,此为客户端
#include "./net.h"
int main(int argc, const char *argv[])
{
//1、创建数据报套接字 socket
//2、发送数据 sendto
//3、接收数据 recvfrom
//4、关闭socket
//创建socket
int udp_socket = 0;
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if(udp_socket < 0)
{
perror("socket error");
return -1;
}
printf("socket ok!\n");
//发送数据
//定义一个结构体,用于存放服务器端的ip和port
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(argv[1]);
server.sin_port = htons(atoi(argv[2]));
char buf[20] = {'\0'};
while(1)
{
memset(buf, '\0', sizeof(buf));
printf("请输入要发送的数据:");
fgets(buf, sizeof(buf), stdin);
//发送数据
sendto(udp_socket, buf, strlen(buf), 0, (struct sockaddr *)&server,sizeof(server));
memset(buf, '\0', sizeof(buf));
//接收数据
recvfrom(udp_socket, buf,sizeof(buf), 0, NULL, NULL);
printf("接收到服务器的数据为:%s",buf);
}
//关闭socket
close(udp_socket);
return 0;
}
服务器端:
//程序功能:实现UDP通讯,此为服务器端
#include <stdio.h>
#include "./net.h"
int main(int argc, const char *argv[])
{
//1、创建数据报socket
//2、绑定自己的ip和port
//4、发送数据
//5、关闭socket
//创建socket
int udp_socket = 0;
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if(udp_socket < 0)
{
perror("socket error");
return -1;
}
printf("socket ok!\n");
//创建一个结构体,用于存放自己的ip和port
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(atoi(argv[1]));
//绑定自己的ip和port
if(bind(udp_socket, (struct sockaddr *)&server, sizeof(server)) < 0)
{
perror("bind error");
return -1;
}
printf("bind ok!\n");
//接收和发送数据
char buf[20] = {'\0'};
//创建一个结构体,用于存放连接上的客户端的ip和port
struct sockaddr_in client;
while(1)
{
memset(&client, '\0', sizeof(client));
//接收数据
int len = sizeof(client);
recvfrom(udp_socket, buf, sizeof(buf), 0, (struct sockaddr *)&client, &len);
printf("client ip=%s port=%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
printf("接收到客户端的数据为:%s", buf);
//发送数据
memset(buf, '\0', sizeof(buf));
printf("请输入要发送的数据:");
fgets(buf ,sizeof(buf), stdin);
sendto(udp_socket, buf, strlen(buf), 0, (struct sockaddr *)&client, len);
}
//关闭socket
close(udp_socket);
return 0;
}
运行结果如下:
uc为客户端运行后的可执行文件,us为服务器端运行后的可执行文件,通过main函数传参的形式传入ip和port。