当前位置: 首页 > article >正文

[网络] UDP通信接口及一些简易项目

本文只是介绍Udp通信接口,并不涉及底层原理

UDP直译是用户数据报协议,是一种很重要的网络通信协议

首先,头文件

       #include <sys/types.h>         
       #include <sys/socket.h>

socket接口

       int socket(int domain, int type, int protocol);

        三个参数:

        第一个参数domain                代表网络类型,常用的比如AF_UNIX,用于本地通信,AF_INET,用于IPV4网络通信,AF_INET6用于IPV6网络通信,

        第二个参数type                     套接字类型,也就是具体的通信类型,常用的SOCK_DGRAM 创建一个面向数据报的套接字,;SOCK_STREAM,创建一个面向字节流的套接字

        第三个参数protocol               具体的通信协议,一般设置成0

        返回值         返回一个文件fd,通过这个文件来进行网络通信

socket相当于建立了一个通信场景

        使用

        int sockfd = ::socket(AF_INET, SOCK_DGRAM, 0);

bind接口

       int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

        第一个参数是socket的返回值.

        第二个参数是一个代表通信目标

        第三个参数是第二个参数的长度

        成功返回0,失败-1

bind 函数的作用是将一个套接字与一个本地地址(包括IP地址和端口号)绑定,使得该套接字只能在该地址上接收数据。对于服务器端的套接字来说,这一步是必要的,因为它需要监听来自客户端的连接请求。对于客户端的套接字来说,bind 通常不是必需的,因为客户端可以在任何可用的端口上发送数据。

请注意它和function头文件里的bind重名 

::bind   Linux下网络通信

std::bind     C++函数参数重新绑定

        // 2.bind
        struct sockaddr_in local;
        memset(&local, 0, sizeof(local));
        local.sin_family = AF_INET;
        local.sin_port = htons(8888);
        local.sin_addr.s_addr = INADDR_ANY; // 服务器端,进行任意IP地址绑定
        int n = ::bind(_sockfd, (struct sockaddr *)&local, sizeof(local));eof(local));

recvform接口

       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

       flags取 0

        这个接口用于从指定udp文件fd中读,第五个参数是输出型参数,发送方的ip+port,用于反向发送数据

        

            char inbuffer[1024];            
            struct sockaddr_in peer;
            socklen_t len = sizeof(peer);
            int n = recvfrom(_sockfd, inbuffer, sizeof(inbuffer) - 1, 0, (struct sockaddr *)&peer, &len);

sendto接口

       ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

        flags 取 0

        这个接口是用来发数据的,第5个参数是目标ip+端口号

    struct sockaddr_in server;
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(ip.c_str());
    server.sin_port = port;
    std::getline(std::cin, line);
    int n = sendto(sockfd, line.c_str(), line.size(), 0, (struct sockaddr *)&server, sizeof(server));

3个简单的小项目

linux/网络/1.udp · 阿巴啊巴DDDD/计算机学 - 码云 - 开源中国


http://www.kler.cn/a/422045.html

相关文章:

  • vue 通过 mqtt 实现实时接收消息
  • 算法笔记:力扣24. 两两交换链表中的节点
  • centos7下安装promethus及grafana
  • flutter 报错 error: unable to find git in your path.
  • MongoDB注入攻击测试与防御技术深度解析
  • 若依前端问题
  • redis针对string的命令及应用场景
  • API 数据接口使用与安全指南
  • vitess使用记录:vtctldclient,设置分表规则
  • Postgres 如何使事务原子化?
  • [每周一更]-(第125期):模拟面试|NoSQL面试思路解析
  • 备赛蓝桥杯--算法题目(2)
  • 基于Matlab地形和环境因素的森林火灾蔓延模拟与可视化研究
  • Windows系统搭建Docker
  • 040集——CAD中放烟花(CAD—C#二次开发入门)
  • qt6 oob
  • 微服务即时通讯系统的实现(服务端)----(3)
  • 基于Python 哔哩哔哩网站热门视频数据采集与可视化分析设计与实现,有聚类有网络语义研究
  • 【数据集】细胞数据集:肿瘤-胎儿重编程的内皮细胞驱动肝细胞癌中的免疫抑制性巨噬细胞(Sharma等人)
  • helm部署golang服务