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$