Internet协议---UDP(一)

一.UDP介绍

UDP(User datagram protocol):用户数据报协议,IP传输层,这是一种不需要连接就可以发送封装的IP数据报的方法。UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。

关于客户端和服务端:对于TCP来说,服务端需要listen,客户端需要connect,所以代码不同需要区分开来。对于UDP来说,服务端需要绑定ip和端口(bind),客户端通常不需要,但客户端也可以通过bind来绑定,所以UDP中服务端和客户端区别很小,代码上来讲不需要区分。

  1. 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);
  2. 注意事项:
    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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值