昨天项目上要增加一个将算法结果通过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();
struct Udp get_scokfd();
bool send_udp(int x1, int x2);
private:
vector<string> read_config();
private:
string config_path;
int client_sockfd;
struct sockaddr_in remote_addr;
#endif
主要定义了读取配置文件函数,启动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);
struct Udp Udp_client::get_scokfd()
vector<string> config = read_config();
string ip = config[0];
const char* ip_char = ip.data();
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;
remote_addr.sin_addr.s_addr=inet_addr(ip_char);
remote_addr.sin_port=htons(port);
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];
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;
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 <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h&g...
在Ubuntu18.04中的两个程序(基于C++)的UDP通信
此文章将展示两个C++应用程序,这个应用中都分别定义了作为Serve和Client的部分,便于相互发送和接收测试。
测试分为两部分,第一部分测试是字符串的发送和接收,第二部分测试是结构体的发送和接收(其实也是先转化为字符串发送,接收后再转化为结构体的方式)
使用者可对相应部分进行注释和取消注释,以分别测试这两个功能。
Code1:这段代码用作发送(实际稍作修改后发送和接收都可)
#include <stdio.h>
会话层:建立会话。(比如电脑之间通信,就会建立会话,跟不同电脑通信,都会建立不同的会话)。
传输层:保证数据能够可靠传输。
网络层 :路由选择 (可以实现不同局域网之间的互联)。
数据链路层 :局域网之间的数据传输。
物理层:决定传输介质。
(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:
AFF-注意力特征融合 | Attentional Feature Fusion
Aphelios:
AFF-注意力特征融合 | Attentional Feature Fusion
Aphelios:
“No module named conda”报错解决
哮着写代码: