Linux——UDP编程&通信

目录

网络Socket通信

Socket函数集合

UDP通信

UdpServer.hpp

UdpServer.cc

UdpClient.cc


只有认知的突破 💫才能带来真正的成长 💫编程技术的学习 💫没有捷径 💫一起加油💫

🍁感谢各位的观看 🍁欢迎大家留言 🍁咱们一起加油 🍁努力成为更好的自己🍁

网络Socket通信

Socket函数集合

TCP和UDP通信,所需的函数如下所示,就这几个函数。

cpp 复制代码
// 创建 socket ⽂件描述符 (TCP/UDP, 客⼾端 + 服务器) 
int socket(int domain, int type, int protocol); 
// 绑定端⼝号 (TCP/UDP, 服务器)                                                     
int bind(int socket, const struct sockaddr *address, socklen_t address_len); 
// 开始监听socket (TCP, 服务器) 
int listen(int socket, int backlog); 
// 接收请求 (TCP, 服务器) 
int accept(int socket, struct sockaddr* address, socklen_t* address_len); 
// 建⽴连接 (TCP, 客⼾端) 
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

UDP通信

步骤:创建socket套接字------>绑定bind------>通信

函数:int socket(int domain, int type, int protocol),创建套接字。

  • 参数

    • int domain

      • AF_UNIX,AF_LOCAL :本地通信。

      • AF_INET :IPv4 网络通信。

    • int type

      • SOCK_STREAM :用于TCP通信。

      • SOCK_DGRAM:用于UDP通信。

    • int protocol:默认为0即可。

  • 返回值

它创建成功返回一个"文件描述符",socket_fd,否则-1。

函数:int bind(int socket, const struct sockaddr *address, socklen_t address_len)

用来绑定IP和端口号的。

使用sendto()和recvfrom()函数继续通信,也可以使用write()和read()函数通信

UdpServer.hpp
cpp 复制代码
#pragma once
#include <iostream>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
uint16_t def_port=-1;
class UdpServer{
public:
    UdpServer(uint16_t port=def_port):_port(port),_isrunning(false){}
    void Init()
    {
        //创建套接字
        _socket=socket(AF_INET,SOCK_DGRAM,0);
        if(_socket<0){
            std::cout<<"Sever make socket failed !"<<std::endl;
            exit(1);
        }
        std::cout<<"Sever make socket sucess !"<<std::endl;
        //进行bind
        struct sockaddr_in cp;
        memset(&cp,0,sizeof(cp));   //清空
        cp.sin_family=AF_INET;
        cp.sin_port=htons(_port);
        cp.sin_addr.s_addr=INADDR_ANY;   //绑定任意IP
        int n=bind(_socket,(struct sockaddr*)(&cp),sizeof(cp));
        if(n<0){std::cout<<"Sever bind failed !"<<std::endl;exit(2);}
        std::cout<<"Sever bind sucess !"<<std::endl;
    }
    void Start()
    {
        _isrunning=true;
        std::cout<<"Sever Start sucess !"<<std::endl;
        //接收消息
        while(_isrunning)
        {
            char inbuffer[1024]={0};
            inbuffer[0]=0;//清空缓冲区
            struct sockaddr_in vip;
            memset(&vip,0,sizeof(vip));   //清空
            socklen_t m=sizeof(vip);
            ssize_t num=recvfrom(_socket,inbuffer,sizeof(inbuffer),0,(struct sockaddr*)(&vip),&m);
            inbuffer[num]=0;
            std::cout<<"@Server:"<<inbuffer<<std::endl;
        }
    }
    void Stop()
    {
        _isrunning=false;
        std::cout<<"Sever Stop sucess !"<<std::endl;
    }
    ~UdpServer(){}
private:
    int _socket;
    uint16_t _port;
    bool _isrunning;
};
UdpServer.cc
cpp 复制代码
#include "UdpServer.hpp"

int main(int argc,char*argv[])
{
    uint16_t port=std::stoi(argv[1]);   //绑定端口号
    UdpServer ud(port);
    ud.Init();
    ud.Start();
    return 0;
}
UdpClient.cc
cpp 复制代码
#include <iostream>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <string>
int main(int argc,char*argv[])
{
    // 创建套接字
    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd < 0)
    {
        std::cout << "Client make socket failed !" << std::endl;
        exit(1);
    }
    std::cout << "Client make socket sucess !" << std::endl;

    uint16_t port=std::stoi(argv[2]);
    std::string ip=argv[1];

    struct sockaddr_in cp;
    memset(&cp, 0, sizeof(cp)); // 清空
    cp.sin_family = AF_INET;
    cp.sin_port = htons(port);
    cp.sin_addr.s_addr=inet_addr(ip.c_str()); 
    //客户端不需要绑定自己的IP和端口号
    while(true)
    {
        std::string messge;
        getline(std::cin,messge);
        sendto(fd,messge.c_str(),messge.size(),0,(struct sockaddr*)(&cp),sizeof(cp));
        std::cout<<messge<<std::endl;
    }
    return 0;
}
相关推荐
星蓝_starblue1 分钟前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
fb_123451 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
蒙奇·D·路飞-2 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
深念Y2 小时前
随身WiFi设备记录
linux·嵌入式·无线·射频·随身wifi·zte
柒号华仔2 小时前
【LINUX】Linux从闹钟到高精度定时器的实现
linux
小星星闪亮登场3 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
云飞云共享云桌面3 小时前
广东精密机械设备工厂8-10人共享一台SolidWorks设计服务器
运维·服务器·3d·自动化·汽车·制造
jieyucx3 小时前
【高级利用】条件竞争与逻辑漏洞:与服务器赛跑的艺术
android·运维·服务器·web安全·文件上传
梓䈑3 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
tianyuanwo3 小时前
服务器OS组件研发效能度量可视系统——顶层方案设计与阶段性规划
运维·服务器·度量系统