TCP协议和UDP协议的区别:
TCP:面向连接,传输可靠(保证数据正确性,保证数据顺序),用于传输大量数据(流模式),速度慢,建立连接需要开销较多。
UDP:面向非连接,传输不可靠,用于传输少量数据(数据包模式),速度快。
UDP协议的搭建流程
---------------------------UDP通信接收端-----------------------------------
1.创建socket
头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
函数原型:
int socket(int domain, int type, int protocol);
参数一:IP协议 AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
AF_IPX IPX - Novell protocols
参数二:传输协议
SOCK_STREAM ---》TCP协议
SOCK_DGRAM ---》UDP协议
参数三:socket的属性 填写为0 默认属性
返回值:成功发回 新的socket文件描述符 ,
失败返回 -1
2.绑定socket
头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
函数原型:
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数一:创建的socket文件描述符
参数二:服务器绑定信息
参数三:服务器信息结构体的大小
返回值:成功返回0 ,失败返回-1
3.接收函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
参数一:socket文件描述符
参数二: 接收缓存区
参数三:接收数据的大小
参数四:接收函数的属性 0默认属性
参数五:保存发送方的IP信息
参数六:成功获取对方信息的大小
---------------------------UDP通信发送端-----------------------------------
1.创建socket
头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
函数原型:
int socket(int domain, int type, int protocol);
参数一:IP协议 AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
AF_IPX IPX - Novell protocols
参数二:传输协议
SOCK_STREAM ---》TCP协议
SOCK_DGRAM ---》UDP协议
参数三:socket的属性 填写为0 默认属性
返回值:成功发回 新的socket文件描述符 ,
失败返回 -1
2.发送函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
参数一:socket文件描述符
参数二: 发送缓存区
参数三:发送数据的大小
参数四:发送函数的属性 0默认属性
参数五:接收方的IP信息
参数六:IP信息结构体的大小
-----------------------------------------------------------------------------------------------------------------------
练习:udp服务器和客户端的简单通信实现
【udprecv.c】
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> int main(int argv,char **argc) { //创建socket int sockfd = socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { perror("create sock fail\n"); } //设置接收端信息 struct sockaddr_in addr; bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argc[1])); addr.sin_addr.s_addr = inet_addr("0.0.0.0");//0.0.0.0为万能地址,可自动匹配IP //绑定接收端信息 char buf[100]={0}; int ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); if(ret < 0) perror("bind fail:"); //接收UDP数据包 struct sockaddr_in client_addr; bzero(&client_addr,sizeof(client_addr)); int len = sizeof(client_addr); while(1) { ssize_t ret = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len); if(ret < 0) perror("error:"); else printf("buf = %s\n",buf); } close(sockfd); }
-----------------------------------------------------------------------------------------------------------------------
【udpsend.c】
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> int main(int argv,char **argc) { //创建socket int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { perror("create sock fail\n"); } //设置接收端的信息 struct sockaddr_in addr; bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argc[1])); addr.sin_addr.s_addr = inet_addr(argc[2]); char buf[10]={"udpdate"}; int ret=0; //发送UDP数据包 while(1) { ret=sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&addr,sizeof(addr)); if(ret>0) { printf("buf=%s\tsize=%d\n",buf,ret); } sleep(1); } close(sockfd); }
-----------------------------------------------------------------------------------------------------------------------
程序运行时必须
先运行服务器程序,
再运行客户端程序,并且设置端口和服务器ip地址