linux网络--简单udp代码

这篇具有很好参考价值的文章主要介绍了linux网络--简单udp代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在本地端模拟实现一个udp通信的代码

1.服务器端--初始化

    我们运行程序的时候,希望的运行方式为 ./serve 127.0.0.1 8080

所以就需要我们在main函数接收命令行传递过来的参数

创建步骤以及注意事项

1.1  创建套接字

函数原型:

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

参数

domian:域  ,说明了套接字是用来网络通讯还是本地通讯

linux网络--简单udp代码,网络,linux,udp

红圈圈出来的三个为最常用的。

type 类型---选择在网络中的通讯是流式通讯还是数据报式的通讯.

这里使用的是udp通讯,所以这里选择使用数据报式

数据报套接字提供一种无连接、不可靠的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。SOCK——DGRAM

protocol :protocol: 一般忽略即可 即为0

返回值 返回值类型为Int,返回值为-1时代表创建套接字失败,同时设置error,成功后返回sock

1.2绑定端口与ip

函数原型:

int bind(int socket, const struct sockaddr *address,socklen_t address_len);

参数:

socket:套接字  ,传递我们上方创建的套接字,将端口与ip与其绑定

const struct sockaddr *address :

结构体内有如下成员

linux网络--简单udp代码,网络,linux,udplinux网络--简单udp代码,网络,linux,udp

sin_port 表示了端口号

sin_addr表示了ip地址 由定义可以发现ip地址为32位的

我们要将此作为参数传递,那么就需要为该结构体赋值。不过在使用之前,最好将其清零

可以使用memset、bzero等函数

        在网络传输中一切以大端进行传输,所以在初始化该结构体时,需要转为大端,系统为我们提供了一个接口:htons(端口)

        主机转网络字节序因为我们的_port是我们自己定义的,有大小端之分,所以就需要转为大端   htons-----主机序列转网络序列,又因为port为短整型,为2字节,所以使用htons即可。

sin_addr  :  平常使用的ip为诸如192.168.1.1 这些为点分十进制风格的。

ip地址是一个32位的整数,正好可以使用4字节(32位)表示。原理:

        因为ip地址在我们看来是192.188.1.1 是点分十进制风格的,

        IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”。

        每段8位二进制数之间用点(.)隔开,以点分十进制的形式书写,

        所以ip地址占4个字节。

        那ip地址是给人看的,我们在网络中传输的话,就需要相应的转换

        1.把它转为二进制

        2.再使用主机转网络,修正其大小端问题。

        系统为我们提供了一个函数,可以同时完成上述两个任务。

        inet_addr();

注意:接收的参数类型位struct sockaddr *

而我们传递的类型位struct sockaddr_in * 需要强制类型转换?

为什么不使用void*? -->因为这一套流程出来的时候,c语言还不支持void*

返回值:返回值小于0时表示绑定失败,同时设置error

socklen_t address_len: 结构体的大小

2.服务器端--接收数据recvfrom

接收数据使用的常用的接口为

ssize_t recvfrom(int socket, void *restrict buffer, size_t length,
              int flags, struct sockaddr *restrict address,
              socklen_t *restrict address_len);

socket:套接字,使用上面创建出来的套接字即可

buffer:接收到的数据存放的buffer 

length 该buffer的大小

flags 默认设置为0

重点介绍 struct sockaddr *restrict address

在这里,它是输出型参数,用于获取向我发送信息的ip地址与端口号。

address_len 是输入输出形参数

        输入输出型参数   做输入型参数时,传递的是buffer的大小

        做输出型参数时,返回实际接收的字节大小

        socklen_t len = sizeof(buffer);

返回值 : 返回接收到的数据个数

 3.发送数据sendto

ssize_t sendto(int socket, const void *message, size_t length,
              int flags, const struct sockaddr *dest_addr,
              socklen_t dest_len);

 

#ifndef __UDP_SERVE__H_
#define __UDP_SERVE__H_
#include <iostream>
#include "log.hpp"
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <cstring>
#include <netinet/in.h>
#include <arpa/inet.h>
class serve
{
public:
    serve(uint16_t port=8080) : _port(port), _sock(-1)
    {
    }
    void serveInit()
    {
        // 1.创建套接字
        _sock = socket(AF_INET, SOCK_DGRAM, 0);
        if (_sock == -1)
        {
            message(FATAL, "%d-%s", errno, strerror(errno));
        }
        // 2.绑定端口与ip
        struct sockaddr_in local;
        bzero(&local, sizeof(local)); // 将local内存设置为0
        local.sin_family = AF_INET;
        // 2.1 绑定端口 --需要主机转网络字节序
        /*
        主机转网络字节序
        因为我们的_port是我们自己定义的,有大小端之分,所以就需要转为大端
        htons-----主机序列转网络序列,又因为port为短整型,为2字节,所以使用htons即可
        */
        local.sin_port = htons(_port);
        // 2.2 绑定Ip地址
        /*
        因为ip地址在我们看来是192.188.1.1 是点分十进制风格的,
        IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”。
        每段8位二进制数之间用点(.)隔开,以点分十进制的形式书写,
        所以ip地址占4个字节。
        那ip地址是给人看的,我们在网络中传输的话,是不是要1.把它转为二进制
        2.再使用主机转网络,修正其大小端问题。
        系统为我们提供了一个函数,可以同时完成上述两个任务。
        inet_addr
        */
        local.sin_addr.s_addr =_ip.empty()? INADDR_ANY : inet_addr(_ip.c_str());
        if (bind(_sock, (struct sockaddr *)&local, sizeof(local)) < 0)
        {
            message(FATAL, "[%d-%s]", errno, strerror(errno));
            exit(2);
        }
        message(NORMAL, "[%s-%u-%s]", _ip.c_str(), _port, "success!");
    }

    void start()
    {
        // 1.读取数据
        char buffer[1024];
        while (1)
        {
            // 输出型参数,用于获取向我发送信息的ip地址与端口号
            struct sockaddr_in peer;
            bzero(&peer, sizeof(peer));
            // 输入输出型参数   做输入型参数时,传递的是buffer的大小
            // 做输出型参数时,返回实际接收的字节大小
            socklen_t len = sizeof(buffer);

            ssize_t s = recvfrom(_sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)(&peer), &len);
            if (s > 0)
            {
                buffer[s]=0;
                // 获取端口号
                // 因为从网络中来,大小端字节序需要重新更正---
                // 网络变主机
                uint16_t cliport = ntohs(peer.sin_port);
                std::string cliip = inet_ntoa(peer.sin_addr);
                // 分析数据
                // 写回数据
                std::cout<<"ip: "<<cliip<<"port: "<<cliport<<": "<<buffer<<std::endl;
                sendto(_sock,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,sizeof(peer));
            }
        }
    }

private:
    std::string _ip;
    uint16_t _port; // port为16位的整数
    int _sock;
};

#endif

 

需要重点注意的是  

 std::cout<<"ip: "<<cliip<<"port: "<<cliport<<": "<<buffer<<std::endl;

如果我们在向控制台输出时,不加后面的end,不会刷新缓冲区

所以需要使用end 或者fflush(stdout)。文章来源地址https://www.toymoban.com/news/detail-842521.html

到了这里,关于linux网络--简单udp代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Socket简单的UDP网络程序

    ⭐ 小白苦学IT的博客主页 ⭐ 初学者必看:Linux操作系统入门 ⭐ 代码仓库:Linux代码仓库 ❤关注我一起讨论和学习Linux系统 网络编程前言 网络编程是连接数字世界的桥梁,它让计算机之间能够交流信息,为我们的生活和工作带来便利。从简单的网页浏览到复杂的分布式系统,

    2024年04月12日
    浏览(28)
  • 网络编程套接字(2): 简单的UDP网络程序

    3.1 服务端创建 (1) 创建套接字 create an endpoint for communication: 创建用于通信的端点 关于socket参数详细介绍: (1) domain: 指定套接字的通信域,相当于 struct sockaddr结构体的前16比特位(2字节) domain的选项是以宏的形式给出的,我们直接选用即可。常用就是上面框住的两个: AF_UNIX,本

    2024年02月10日
    浏览(29)
  • 【网络编程】UDP简单实现翻译软件与网络聊天室

    在上一章【网络编程】demo版UDP网络服务器实现实现了客户端和服务端之间的数据的发送与接收,上一章我们是直接让服务端把接收到的数据打印出来。 但是服务端并不是只接收到数据就完了,它还要 处理任务 。 所以我们可以在服务端设置一个回调函数: 用来处理接收到的

    2024年02月05日
    浏览(61)
  • 简单的UDP网络程序·续写(后端服务器)

    该文承接文章 简单的UDP网络程序 对于客户端和服务端的基本源码参考上文,该文对服务器润色一下,并且实现几个基本的业务服务逻辑 目录 demo1 第一个功能:字典翻译 初始化字典 测试代码:打印 字符串分割 客户端修改 成品效果 字典热加载 signal demo2 远端命令行解析 p

    2024年02月09日
    浏览(29)
  • [Qt网络编程]之UDP通讯的简单编程实现

    hello!欢迎大家来到我的Qt学习系列之 网络编程之UDP通讯的简单编程实现。 希望这篇文章能对你有所帮助!!! 本篇文章的相关知识请看我的上篇文章: 目录 UDP通讯  基于主窗口的实现  基于线程的实现          UDP数据报协议是一个面向无连接的传输层报文协议 ,它简

    2024年04月25日
    浏览(41)
  • 【计算机网络】网络编程套接字&UDP服务器客户端的简单模拟

    需要云服务器等云产品来学习Linux的同学可以移步/–腾讯云–/官网,轻量型云服务器低至112元/年,优惠多多。(联系我有折扣哦) 每台主机都有自己的IP地址,当数据在进行通信的时候,除了要发送的数据外,在报头里面还要包含发送方的IP和接收方的IP,这里发送方的IP就

    2024年02月20日
    浏览(43)
  • 网络编程套接字(二)之UDP服务器简单实现

    目录 一、服务端UdpServer 1、udp_server.hpp 1、服务器的初始化 2、服务器的运行 2、udp_server.cc 二、客户端UdpClient udp_client.cc 三、完整代码 首先,我们在该文件中,将服务器封装成一个类,而作为一款服务器,必须要有自己的端口号,同时网络服务器需要有对应的IP地址,文件描述

    2024年04月16日
    浏览(46)
  • 【嵌入式学习】网络通信基础-项目篇:简单UDP聊天室

    源码已在GitHub开源:0clock/LearnEmbed-projects/chat 客户端功能: 上线发送登录的用户名[yes] 发送消息和接收消息[yes] quit退出 服务器端功能: 统计用户上线信息,放入链表中[yes] 接收用户信息并给其他用户发送消息[yes] 服务器也支持给所有用户群发消息[yes] 接收下线提醒

    2024年01月25日
    浏览(40)
  • 【网络编程】利用套接字实现一个简单的网络通信(UDP实现聊天室 附上源码)

    源IP地址(Source IP Address): 源IP地址是数据包发送方(或数据流出发点)的唯一标识符。它用于在互联网或本地网络中定位发送数据包的设备或主机。源IP地址是数据包的出发点,即数据从这个地址开始传送,向目的IP地址指示的设备发送。 在TCP/IP协议中,源IP地址通常由发

    2024年02月14日
    浏览(67)
  • 【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    我们用Java实现UDP数据报套接字编程,需要借用以下API来实现 网络编程, 本质上是要操作网卡. 但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡. 因此进行网络通信, 势必需要先有一个 socket 对象. DatagramSocket 是UDP Socket,

    2024年03月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包