1 服务端代码
#include <stdio.h>
#include <head.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>#define PORT 6666 //端口号:1024~49191
#define IP "192.168.1.110"//"192.168.122.120"int main(int argc, const char *argv[])
{//创建报式套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd < 0){ERR_MSG("socket");return -1;}printf("sfd = %d\n",sfd);//填充服务器自身的地址信息结构体,真实的地址信息结构体根据地址族制定//AF_INET : man 7 ipstruct sockaddr_in sin;sin.sin_family = AF_INET; //必须填AF_INETsin.sin_port = htons(PORT); //端口号:1024~49151sin.sin_addr.s_addr = inet_addr(IP);//本机IP:ifconfig//绑定服务器的地址信息结构体到套接字上if(bind(sfd, (struct sockaddr*)&sin,sizeof(sin)) < 0){ERR_MSG("bind");return -1;}printf("bind success\n");char buf[128]="";ssize_t res=0;struct sockaddr_in cin;socklen_t addrlen= sizeof(cin);while(1){bzero(buf,sizeof(buf));//接收数据//res = recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL);//res = recv(sfd,buf,sizeof(buf),0);//res = read(sfd,buf,sizeof(buf));res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);if(res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d] : %s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);//buf[sizeof(buf)-1]=0;strcat(buf,"*_*");//发送数据if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭文件描述符close(sfd);return 0;
}
2 客户端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <head.h>#define PORT 6666 //端口号:服务器绑定的端口号
#define IP "192.168.1.110"//"192.168.122.109" //IP:服务器绑定的IPint main(int argc, const char *argv[])
{//创建报式套接字int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd < 0){ERR_MSG("socket");return -1;}printf("cfd = %d\n", cfd);//绑定客户端的地址信息结构体到套接字上---->非必须绑定//若不绑定,则操作系统会给客户端绑定运行主机的IP和随机端口//填充服务器的地址信息结构体,给sendto函数使用//要发给谁,就填谁的地址信息struct sockaddr_in sin;sin.sin_family = AF_INET; //必须填AF_INETsin.sin_port = htons(PORT); //端口号:服务器绑定的端口号 sin.sin_addr.s_addr = inet_addr(IP); //IP:服务器绑定的IPchar buf[128] = "";ssize_t res = 0;struct sockaddr_in rcvaddr; //存储接收到的数据包从哪里来socklen_t addrlen = sizeof(rcvaddr);while(1){bzero(buf, sizeof(buf));printf("请输入>>> ");fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//发送数据if(sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("sendto");return -1;}printf("sendto success\n");//接收数据res = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&rcvaddr, &addrlen);//res = recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);//res = recv(cfd, buf, sizeof(buf), 0);//res = read(cfd, buf, sizeof(buf));if(res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d] : %s\n", \inet_ntoa(rcvaddr.sin_addr), ntohs(rcvaddr.sin_port), buf);}//关闭文件描述符close(cfd);return 0;
}
3 服务端结果
ubuntu@ubuntu:03_udp$ gcc 01_ser.c -o ser
ubuntu@ubuntu:03_udp$ ./ser
sfd = 3
bind success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 333
sendto success
^C
ubuntu@ubuntu:03_udp$
4 客户端结果
ubuntu@ubuntu:03_udp$ gcc 02_cli.c -o cli
ubuntu@ubuntu:03_udp$ ./cli
cfd = 3
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 333
sendto success
[192.168.1.110 : 6666] : 333*_*
请输入>>> ^C
ubuntu@ubuntu:03_udp$