[网络] 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/计算机学 - 码云 - 开源中国

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值