Linux程序设计网络编程——udp通信

TCP与UDP的区别

TCP(传输控制协议):

1、面向连接,有连接三次握手,断开四次握手的过程。

2、以字节流的形式传输,传输有序可靠的数据。

3、大型文件的传输,保证文件的有序性,可靠性。

4、传输速度较慢,但是可靠性高。

UDP(用户数据包协议):

1、面向无连接,以数据报形式传输。

2、传输不保证有序,也有可能丢失(传输过快,缓冲区未接受导致丢包)

3、适合实时信息的传输,用于轻量级的数据传输,如视频通信,QQ通信,丢包则重传,稍微的不可靠性不影响效果。

4、传输速度快,但是可靠性低。

 

UDP通信模型:

Linux程序设计网络编程——udp通信_第1张图片

 

 

Linux程序设计网络编程——udp通信_第2张图片

 

代码实现:

#include
#include          /* See NOTES */
#include
#include
#include
#include
#include
int main()
{
    
    
    //1.创建socket
    int sockfd=socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd==-1)
    {
        perror("socket fail");
        exit(-1);
    }        
    //2.
    struct sockaddr_in  sndAddr;
    memset(&sndAddr,'\0',sizeof(sndAddr));
    sndAddr.sin_family=AF_INET;
    sndAddr.sin_port=htons(10087);//设置端口号
    sndAddr.sin_addr.s_addr=inet_addr("192.168.6.101");//设置IP地址
        
    char buf[1024]="hello";
    int addrlen=sizeof(sndAddr);
    int res=sendto(sockfd, buf, sizeof(buf), 0,(struct sockaddr*)&sndAddr,  addrlen);
    if(res==-1)
    {
        perror("sendto fail");
        exit(-1);
    }
    

    if(res==-1)
    //3.关闭
    close(sockfd);
    
    return 0;
}

 

 

 

#include
#include          /* See NOTES */
#include
#include
#include
#include
#include
int main()
{
    
    
    //1.创建socket
    int sockfd=socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd==-1)
    {
        perror("socket fail");
        exit(-1);
    }        
    //2.绑定IP地址
    struct sockaddr_in  recvAddr;
    memset(&recvAddr,'\0',sizeof(recvAddr));
    recvAddr.sin_family=AF_INET;
    recvAddr.sin_port=htons(10087);//设置端口号
    recvAddr.sin_addr.s_addr=inet_addr("192.168.6.101");//设置IP地址
    int res=bind(sockfd,(struct sockaddr *)&recvAddr,sizeof(recvAddr));
    if(res==-1)
    {
        perror("bind fail");
        return -1;
    }
    //3.接收数据
    char buf[1024]={0};
    struct sockaddr_in  sendAddr;
    int addrlen=sizeof(sendAddr);
     res= recvfrom(sockfd, buf,sizeof(buf), 0,
                        (struct sockaddr *)&sendAddr, &addrlen);
    if(res==-1)
    {
        perror("reccvfrom fail");
        return -1;
    }
    char* ip=inet_ntoa(sendAddr.sin_addr);
    printf("I have recv %s message %s,the total bytes is %d\n",ip,buf,res);
    
    //4.关闭
    close(sockfd);
    return 0;
}

你可能感兴趣的:(Linux程序设计网络编程——udp通信)