一.UDP介绍
UDP(User datagram protocol):用户数据报协议,IP传输层,这是一种不需要连接就可以发送封装的IP数据报的方法。UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
关于客户端和服务端:对于TCP来说,服务端需要listen,客户端需要connect,所以代码不同需要区分开来。对于UDP来说,服务端需要绑定ip和端口(bind),客户端通常不需要,但客户端也可以通过bind来绑定,所以UDP中服务端和客户端区别很小,代码上来讲不需要区分。
- UDP编程:
发送数据:socket() -> sendto() -> socket.close()
接受数据:socket() -> bind() -> reccfrom() -> socket.close()
发送数据:sockaddr_in receiverAddress; //定义接受方地址 receiverAddress.sin_family=AF_INET; //AF_INET:IPV4 AF_INET6:IPV6 receiverAddress.sin_addr.s_addr=inet_addr(ip); //接受方IP地址 receiverAddress.sin_port=htons(port); //接受端口 socketFd=socket(AF_INET,SOCK_DGRAM,0); //创建套接字,SOCK_DGRAM:UDP sendto(socketFd,x,size,0,(sockaddr*)&receiverAddress,sizeof(receiverAddress)); //发送数据,X:数据包(指针),size:数据包长度(字节数)。 close(socketFd);
接受数据:sockaddr_in receiverAddress; sockaddr_in senderAddress; receiverAddress.sin_family=AF_INET; receiverAddress.sin_addr.s_addr=INADDR_ANY; receiverAddress.sin_port=htons(receiverPort); socketFd=socket(AF_INET,SOCK_DGRAM,0); if(socketFd==-1) cout<<"\033[31mfailed to create receiver socket\033[0m"<<endl; int ret=bind(socketFd,(sockaddr*)&receiverAddress,sizeof(receiverAddress)); //将套接字与本机地址和端口绑定。 if(ret==-1) cout<<"\033[31mbind receiver socket failed\033[0m"<<endl; socklen_t len=sizeof(senderAddress); recvfrom(socketFd,x,size,0,(sockaddr*)&senderAddress,&len); //接受数据,并保存发送方地址 close(socketFd);
- 注意事项:
3.1 recvfrom(fd,buf,size,sockaddr*from,fromlen):
buf:数据的地址(指向数据的内存空间)
size:数据包的大小(字节数)
from:指针,指向装有数据源地址的缓冲区
fromlen:指针,指向from缓冲区长度值。
3.2 一字节地址单元对应一字节存储单元。
3.3 虚拟IP:A级:10.0.0.1-10.255.255.254 B级:172.16.0.1-172.31.255.254 C级:192.168.0.1-192.168.255.254