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;
}
相关推荐
Wave8456 小时前
C++继承详解
开发语言·c++·算法
Tairitsu_H6 小时前
C++类基础概念:定义、实例化和this指针
开发语言·c++
REDcker6 小时前
Linux disown命令详解 后台作业脱管与终端退出
linux·运维·chrome
不想写代码的星星6 小时前
C++17 string_view 观察报告:好用,但有点费命
c++
cyber_两只龙宝6 小时前
【Oracle】Oracle之SQL的转换函数和条件表达式
linux·运维·数据库·sql·云原生·oracle
被摘下的星星6 小时前
四层模型TCP/IP协议栈
运维·服务器·网络
努力努力再努力wz6 小时前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz6 小时前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python
.千余6 小时前
【Linux】基本指令2
linux·运维·服务器
2601_949815846 小时前
Linux下PostgreSQL-12.0安装部署详细步骤
linux·运维·postgresql