lvxuzhou


私信TA

用户名:lvxuzhou

访问量:106753

签 名:

lvxuzhou

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

  自我简介:

TA的其他文章

ZeroMQ 基础一
浏览:121

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 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »