TCP通信和UDP通信各自的优缺点
原创
©著作权归作者所有:来自51CTO博客作者黑马金牌编程的原创作品,请联系作者获取转载授权,否则将追究法律责任
TCP通信和UDP通信各自的优缺点:
- TCP:面向连接,可靠数据包传输。对于不稳定的网络层,采取完全弥补的通信方式。——丢包重传
- UDP:无连接的,不可靠的数据报传递。对于不稳定的网络层,采取完全不弥补的通信方式。默认还原网络状况
- 游戏、视频会议、视频电话。 ----应用层数据校验协议,弥补UDP的不足。
UDP实现的C/S模型:
recv()send() 只能用于TCP通信。替代read、write
accpet();----Connect(); ----被舍弃
server:
lfd=socket(AF_INET,SEREAM,0); SOCK_DGRAM----报式协议。
bind();
listen(); ----可有可无
while(1){
read(cfd,buf,sizeof)----被替换-----recvfrom()---涵盖accept传出地址结构。
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:传入传出
返回值:成功接收数据字节数。失败:-1 errn。 0:对端关闭。
小--大
write();----被替换----sendto() ----connect
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
src_addr:(struct sockaddr*)&addr传入。对端地址结构
addrlen:地址结构长度
返回值:成功接收数据字节数。失败:-1, errno
}
close();
client:
connfd=socket(AF_INET,SOCK_DGRAM,0);
sendto('服务器的地址结构',地址结构大小)
recvfrom()
写到屏幕
close
本地套接字:
- IPC:pipe、fifo、mmap、信号、本地套(domain)---CS模型
- 对比网络编程TCP C/S模型,注意以下几点:
- 1.int socket(int domain,int type,int protocol); 参数 domain:AF_INET-->AF_UNIX/AF_LOCAL
- type:SOCK_STREAM/SOCK_DGRAM 都可以。
- 2.
地址结构:socket_in--->sockaddr_un
struct sockaddr_in srv_addr; ---->struct sockaddr_un srv_addr;
srv_addr.sin_family=AF_INET; --->srv_addr.sun_familt=AF_UNIX;
srv_addr.sin_port=htons(8888); strcpy(srv_addr.sun_path,“srv.socket”)
srv_addr.sin_addr.s_addr=htonl(INADDR_ANY); len=offsetof(struct sockaddr_un,sun_path)+strlen("srv.socket");
bind(fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); --->bind(fd,(struct sockaddr*)&srv_addr,len);
- 3.bind()函数调用成功,会创建一个socket。因此为保证bind成功,通常我们在bind之前,可以使用unlink("srv.socket");
- 4.客户端不能依赖“隐式绑定”。并且应该在通信建立过程中,创建且初始化2个地址结构:
1.client_addr-->bind()
2.server_addr-->connect();
对本地套接字和网络套接字:
server:
网络套接字 本地套接字
client: