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

1.头文件

#ifndef UDP_CLIENT_H
#define UDP_CLIENT_H
#include <iostream>
#include <fsteam>
#include <cstring>
#include <ifstream>
#include <vector>
#include <string>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
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<string> 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 <iostream>
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<string> config = read_config();  
    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<string> Udp_client::read_config()
    string s;
    vector<string> config;
    ifstream infile;
    infile.open(config_path);
    if(infile)
        while(getline(infile, s))
            config.push_back(s);
    infile.close();
    return config;

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

#include #include #include #include #include #include #include &lt;stdio.h&gt;#include &lt;sys/types.h&gt;#include &lt;sys/socket.h&gt;#include &lt;netinet/in.h&gt;#include &lt;arpa/inet.h&g...
Ubuntu18.04中的两个程序(基于C++)的UDP通信 此文章将展示两个C++应用程序,这个应用中都分别定义了作为Serve和Client的部分,便于相互发送和接收测试。 测试分为两部分,第一部分测试是字符串的发送和接收,第二部分测试是结构体的发送和接收(其实也是先转化为字符串发送,接收后再转化为结构体的方式) 使用者可对相应部分进行注释和取消注释,以分别测试这两个功能。 Code1:这段代码用作发送(实际稍作修改后发送和接收都可) #include <stdio.h&gt
会话层:建立会话。(比如电脑之间通信,就会建立会话,跟不同电脑通信,都会建立不同的会话)。 传输层:保证数据能够可靠传输。 网络层 :路由选择 (可以实现不同局域网之间的互联)。 数据链路层 :局域网之间的数据传输。 物理层:决定传输介质。 (2) TCP/IP四层模型(TCP/IP协议簇) Tcp协议:用来实现数据的可靠传输。 UDP:传输数
////////////////////////////////////////////////////////////////////////// // UDPServer.cpp #include <stdio.h> #include <WINSOCK2.H> #pragma comment(lib,"WS2_32.lib") #define ...
VSCode是一款跨平台的轻量级IDE,支持众多编程语言,包括C/C++。Ubuntu是一款开源的操作系统,是Linux的一种发行版。在Ubuntu上使用VSCode开发C/C++项目可以大大提高开发效率。 VSCode对于C/C++开发提供了很好的支持,可以进行多文件编译、调试和断点设置。在Ubuntu上使用VSCode进行C/C++项目开发,可以通过安装相应的插件获得更加完善的功能。例如使用C/C++插件可以实现自动补全和错误检查,使用Code Runner插件可以快速运行代码,使用clang-format插件可以格式化代码。 另外,Ubuntu作为一款优秀的操作系统,提供了很好的开发环境和工具支持。例如使用apt-get命令可以方便地安装C/C++编译器以及相关的开发库,使用gcc、g++命令可以进行C/C++的编译和链接,使用gdb命令可以进行C/C++的调试。 总而言之,在Ubuntu上使用VSCode进行C/C++项目开发,可以充分发挥两者的优势,提高开发效率,使程序开发更加快捷、高效、安全。
AC-FPN:比FPN提升3个点 | Attention-guided Context Feature Pyramid Network for Object Detection lhmamba: 您好,mmdet下怎么加,我的代码能力不是很好,麻烦指点下,谢谢 AFF-注意力特征融合 | Attentional Feature Fusion Aphelios: 你好,我的错误和你类似,你是如何解决的呢 AFF-注意力特征融合 | Attentional Feature Fusion Aphelios: 哥们能不能教下怎么加到v5或者v7啊 “No module named conda”报错解决 哮着写代码: 安装anaconda的时候一定要仔细看下安装路径,一定要安装在原来的位置呀,一路回车过去是不行的!!!!!惨痛教训!!!!!