发送端实现:U1.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char** argv)
{
// 第一步:创建套接字
// UDP 协议使用数据报式套接字,即套接字类型为 SOCK_DGRAM
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock == -1)
{
perror("socket");
return 1;
}
// 第二步:绑定地址(IP + Port)
struct sockaddr_in myaddr;
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
myaddr.sin_port = htons(8888);
if(bind(sock, (struct sockaddr*)&myaddr, sizeof(myaddr)) == -1)
{
perror("bind");
return 1;
}
// 第三步:收发数据
// 发送数据
// 指定接收方地址
struct sockaddr_in dst_addr;
dst_addr.sin_family = AF_INET;
dst_addr.sin_addr.s_addr = inet_addr(argv[1]);//命令行输入接收方IP
dst_addr.sin_port = htons(atoi(argv[2]));//命令行输入端口号
// 指定数据内容
char msg[128];
int ret;
while(1)
{
// 发送出去
sprintf(msg, "hello, i am world");
ret = sendto(sock, msg, strlen(msg), 0, (struct sockaddr*)&dst_addr, sizeof(dst_addr));
sleep(1);
if(ret == -1)
{
perror("sendto");
}
}
// 第四步:关闭套接字
close(sock);
return 0;
}
接收方实现:U2.c
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
// 第一步:创建套接字
// UDP 协议使用数据报式套接字,即套接字类型为 SOCK_DGRAM
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock == -1)
{
perror("socket");
return 1;
}
// 第二步:绑定地址(IP + Port)
struct sockaddr_in myaddr;
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = INADDR_ANY;
myaddr.sin_port = htons(9999);
if(bind(sock, (struct sockaddr*)&myaddr, sizeof(myaddr)) == -1)
{
perror("bind");
return 1;
}
// 第三步:收发数据
char msg[100];
int ret;
// 接收数据
//connect(sock, (struct sockaddr*)&addr, sizeof(addr));
while(1)
{
struct sockaddr_in addr;
socklen_t len = sizeof(addr);
// 调用 recvfrom 函数时如果当前没有任何数据包,它会阻塞当前线程,直到成功接收到一个数据包或出错。出错时返回 -1,成功接收到一个数据包时返回接收到的字节数,如果收到空数据包,返回值为 0
ret = recvfrom(sock, msg, sizeof(msg) - 1, 0, (struct sockaddr*)&addr, &len);
if(0 < ret)
{
msg[ret] = '\0';
printf("\n%s:%d说:%s\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), msg);
}
}
// 第四步:关闭套接字
close(sock);
return 0;
}
编译:gcc U1.c -o U1
gcc U2.c -o U2
运行:./U1 192.xxx.xxx.xxx(IP地址) 9999(端口号,两程序需一致)文章来源:https://uudwc.com/A/LaWwg
./U2文章来源地址https://uudwc.com/A/LaWwg