ubuntu C/C++UDP客户端的一个简单实现

昨天项目上要增加一个将算法结果通过UDP协议发送报文给用户服务端的小功能,自己百度了相关资料,发现网上的代码都是将启动UDP套接字和发送数据写在一个函数里, 这样就造成使用的时候,会重复启动套接字。于是我结合自己的项目,写了一个UDP_CLIENT类,可以实现动态ip, port设置,将启动套接字和发送数据函数分开实现。
1.头文件

#ifndef UDP_CLIENT_H
#define UDP_CLIENT_H
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
using namespace std;


struct Udp{
	int client_sockfd; //套接字
	struct sockaddr_in remote_addr;  //服务器端网络地址结构体
};


class Udp_client{    

public:
    Udp_client(string config_path);
    ~Udp_client();
    //启动udp连接获得套接字
    struct Udp get_scokfd(); 
    //发送数据
    bool send_udp(int x1, int x2);

private:
    //读取配置文件中,服务器端的ip和port
    vector read_config();

private:
    string config_path;//配置文件地址
    int client_sockfd;
    struct sockaddr_in remote_addr;
};


#endif // UDP_CLIENT_H

主要定义了读取配置文件函数,启动UDP连接得到套接字函数,发送数据函数
2.cpp文件,主要是类成员函数的实现

#include "udp_client.h"
#include 
using namespace std;

Udp_client::Udp_client(string config_path)
{
    this->config_path = config_path;
    //启动连接
    struct Udp result = get_sockfd();
    client_sockfd = result.client_sockfd;
    remote_addr = result.remote_addr;
}

~Udp_client::Udp_client()
{
    //关闭套接字
    close(client_sockfd);
    //int num = shutdowm(client_sockfd, _);
}

//启动udp连接获得套接字
//返回套接字和服务器端网络地址结构体
struct Udp Udp_client::get_scokfd()
{
    //解析得到配置文件中的ip, por
    vector config = read_config();  
    //ip
    string ip = config[0];
    const char* ip_char = ip.data(); //string 转为const char* 
    //port
    int port = 8000;
    stringstream ss(config[1]);
    ss >> port;
    
    int client_sockfd;
    struct sockaddr_in remote_addr; //服务器端网络地址结构体

    memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
    remote_addr.sin_family=AF_INET; //设置为IP通信
    remote_addr.sin_addr.s_addr=inet_addr(ip_char);//服务器IP地址
    remote_addr.sin_port=htons(port); //服务器端口号

    /*创建客户端套接字--IPv4协议,面向无连接通信,UDP协议*/
    if((client_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
    {
        perror("socket error");
    }
	struct Udp result;
	result.client_sockfd = client_sockfd;
	result.remote_addr = remote_addr;
	return result;
}

//发送数据
bool Udp_client::send_udp(int x1, int x2)
{
    int len;
    int sin_size;
    char buf[BUFSIZ];  //数据传送的缓冲区
    //数据格式 ch6:x1,x2
    info = "ch6:" + to_string(x1) + "," + to_string(x2);
    info_char = message.data();
    
    strcpy(buf, info_char); // 发送的内容
    printf("sending: '%s'/n",buf);
    sin_size=sizeof(struct sockaddr_in);
    /*向服务器发送数据包*/
    if((len=sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)))<0)
    {
        perror("recvfrom");
        return false;
    }  
    return true;
}

//按行读取配置文件中的ip, port
vector Udp_client::read_config()
{
    string s;
    vector config;
    ifstream infile;
    infile.open(config_path);
    if(infile)
    {
        while(getline(infile, s))
        {
            config.push_back(s);
        }
    }
    infile.close();
    return config;
}

紧接着可以使用main函数测试一下,如果没问题就可以自行编译成库或者直接使用,有兴趣的同学也可以自己实现server端部分代码。

你可能感兴趣的:(ubuntu C/C++UDP客户端的一个简单实现)