udp通信


TCP UDP各自优缺点:
TCP:面向连接的,可靠数据包传输。对于不稳定的网络层,采取完全弥补的通信方式。丢包重传。
优点:

稳定

数据流量稳定、速度稳定、顺序
缺点:

传输速度慢、效率低、开销大
使用场景:数据的完整性要求较高,不追求效率
大数据传输、文件传输

UDP:无连接的 不可靠的数据报传输。对于不稳定的网络层,采取完全不弥补的通信方式。默认还原网络状况
优点:

传输速度快、效率高、开销小
缺点:

不稳定
数据流量、速度、顺序

使用场景:对时效性要求较高场合。稳定性其次
游戏、视频会议、视频通话。大公司 --应用层数据校验协议,弥补udp不足
UDP实现的C/S模型:
recv()/send() 只能用于 tcp 通信。替代 read、write
accept() ---connect() ---被舍弃
server:
lfd = socket(AF_INET,STREAM,0); SOCK_DGRAM--报式协议

bind();
listen(); --可有可无
while(1){

read(cfd,buf,sizeof) --被替代 -- recvfrom()涵盖accept传出地址结构
【udp通信】ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
sockfd: 套接字
buf:存储数据的缓冲区
len:数据长度
flags:0
src_addr: (struct sockaddr*)&addr 传出。对端地址结构
addrlen:地址结构长度


小--大
write(); --被替代 -- sendto()
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
sockfd: 套接字
buf:存储数据的缓冲区
len:数据长度
flags:0
dest_addr: 目标地址结构
addrlen:地址结构长度
返回值:成功 写出数据字节数失败: -1、errno
}

close();

client:

connfd = socket(AF_INET,SOCK_DGREAM,0);
sendto('服务器地址结构’,地址结构大小)
recvfrom()
写到屏幕
close();

//serve#include #include #include #include #include #include #include#define SERV_PORT9527void sys_err(const char* str){ perror(str); exit(1); } int main(){ int lfd = 0; int ret; char buf[BUFSIZ],client__IP[1024]; struct sockaddr_inserv_addr,clit_addr; socklen_t clit_addr_len; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_PORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); lfd =socket(AF_INET,SOCK_DGRAM,0); if(lfd==-1){ sys_err("socket error"); }bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); clit_addr_len = sizeof(clit_addr); while(1){ret = recvfrom(lfd,buf,sizeof(buf),0,(struct sockaddr*)&clit_addr,&clit_addr_len); printf("client ip :%s port:%d\n" ,inet_ntop(AF_INET,(void*)&clit_addr.sin_addr.s_addr,client__IP,sizeof(client__IP)), ntohs(clit_addr.sin_port)); write(STDOUT_FILENO,buf,ret); for(int i=0; i #include #include #include#define SERV_PORT9527void sys_err(const char* str){ perror(str); exit(1); } int main(){ int cfd; char buf[BUFSIZ]; struct sockaddr_in serv_addr; //服务器地址结构serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_PORT); inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr.s_addr); cfd = socket(AF_INET,SOCK_DGRAM,0); if(cfd==-1){ sys_err("socket error"); } while(1){ fgets(buf,sizeof(buf),stdin); sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); int ret = recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL); write(STDOUT_FILENO,buf,ret); } close(cfd); return 0; }


    推荐阅读