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;
}
相关推荐
就不掉头发2 小时前
Linux与数据库
linux·运维·数据库
共享家95272 小时前
C++ string 类从原理到实战
开发语言·c++
认真学GIS2 小时前
日尺度地下水水位!全国11897个地下水动态监测站点2005-2021年日尺度地下水水位(地下水埋深)(EXCEL格式)数据
服务器·前端·excel
2401_858936882 小时前
深入浅出 TCP 通信:从基础到并发服务器实现
服务器·网络·tcp/ip
鲨辣椒100862 小时前
TCP连接有多函数接口阻塞问题???——TCP并发服务器的实现
服务器·网络协议·tcp/ip
Lolo_fi2 小时前
Linux gpio子系统
linux
风中凌乱2 小时前
linux服务器安装部署mayfly-go
linux·服务器·golang
炽天使3282 小时前
龙虾尝鲜记(3)——装ubuntu(续)
linux·运维·ubuntu
2401_858936882 小时前
深入理解 TCP 并发服务器:从 IO 模型到多路复用实现
服务器·tcp/ip·php