lvxuzhou


私信TA

用户名:lvxuzhou

访问量:97339

签 名:

lvxuzhou

等  级
排  名 48
经  验 11191
参赛次数 0
文章发表 56
年  龄 0
在职情况 学生
学  校 西安
专  业

  自我简介:

udp 是一个面向无连接的,不安全的,报式传输层协议,udp 的通信过程默认也是阻塞的。

   1、UDP通信不需要建立连接 ,因此不需要进行 connect () 操作

   2、UDP通信过程中,每次都需要指定数据接收端的IP和端口,和发快递差不多

   3、UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息

   4、UDP对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。

    如果发生了数据丢失,不存在丢一半的情况,如果丢当前这个数据包就全部丢失了

使用 UDP 进行通信,服务器和客户端的处理步骤比 TCP 要简单很多,并且两端是对等的 (通信的处理流程几乎是一样的),

也就是说并没有严格意义上的客户端和服务器端。UDP 的通信流程如下:

udp.jpg

    服务器代码:

#include<arpa/inet.h>
#include<unistd.h>
#include<stdbool.h>
#include<stdint.h>
#include<stdio.h>
#include<stdlib.h>
#define lv_exit(fd,str) \
    if(fd<0) {\
        perror(str);\
        exit(1);\
    }
int main(int argc, char const *argv[])
{
    int fd=socket(AF_INET,SOCK_DGRAM,0);
    lv_exit(fd,"socket"); 
    struct sockaddr_in seraddr;
    seraddr.sin_family=AF_INET;
    seraddr.sin_port=htons(9999);
    seraddr.sin_addr.s_addr=inet_addr("192.168.244.154");
    int bret=bind(fd,(void*)&seraddr,sizeof seraddr);
    lv_exit(bret,"bind");
    while (1)
    {
        struct sockaddr_in cliaddr;
        socklen_t clilen=sizeof cliaddr;
        char buf[512]={0};
        ssize_t len= recvfrom(fd,buf,sizeof(buf)-1,0,(void*)&cliaddr,&clilen);
        printf("%s %d %s ",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port),buf);
        lv_exit(len,"recvfrom");
        len=sendto(fd,buf,len,0,(void*)&cliaddr,clilen);
        lv_exit(len,"sendto");
        
    }
    
    return 0;
}

测试流程:
启动服务器:

QQ图片20211026231104.png

启动客户端:
QQ图片20211026230529.png

 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区