首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用recv()和vector <unsigned char>的更优雅的方法

使用recv()和vector<unsigned char>的更优雅的方法是使用C++的封装和面向对象的特性,将底层的网络通信操作封装成一个类,并提供更简洁、易用的接口。以下是一个简单的示例:

代码语言:c++
复制
#include<iostream>
#include<vector>
#include<string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

class Network {
public:
    Network(const std::string& ip, int port) {
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) {
            std::cerr << "socket error"<< std::endl;
            return;
        }

        struct sockaddr_in serv_addr;
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(port);
        if (inet_pton(AF_INET, ip.c_str(), &serv_addr.sin_addr) <= 0) {
            std::cerr << "inet_pton error"<< std::endl;
            return;
        }

        if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
            std::cerr << "connect error"<< std::endl;
            return;
        }
    }

    ~Network() {
        close(sockfd);
    }

    std::vector<unsigned char> receive() {
        std::vector<unsigned char> data;
        char buffer[1024];
        int n = recv(sockfd, buffer, sizeof(buffer), 0);
        if (n < 0) {
            std::cerr << "recv error"<< std::endl;
            return data;
        }
        data.insert(data.end(), buffer, buffer + n);
        return data;
    }

private:
    int sockfd;
};

int main() {
    Network network("127.0.0.1", 8080);
    std::vector<unsigned char> data = network.receive();
    for (auto& c : data) {
        std::cout << c;
    }
    std::cout<< std::endl;
    return 0;
}

在这个示例中,我们定义了一个名为Network的类,该类封装了底层的socket操作,并提供了一个receive()方法来接收数据。该方法使用recv()函数来接收数据,并将数据存储在一个vector<unsigned char>中,以便更方便地处理数据。

这种方法的优点是,它将底层的网络通信操作封装起来,使得我们可以更容易地使用C++的面向对象特性来处理网络通信。此外,它还提供了一个更简洁、易用的接口,使得我们可以更容易地处理接收到的数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c# 获取串口设备输入(unsigned char * char*)

在调用DLL中方法时候,我们一般要对照函数说明来把C/C++中类型转换为.NET中相对应类型,而且方法必须声明为静态外部函数,即加上public  extern static声明头.如果不加public...,类型是unsigned char。...对于CHARSTRING类型区别本来找到个说比较好文章,但是回到家里后就找不到那文章了。...他们区别就是字符字符串区别,char 声明并赋值时候只能是单字符,char c = 'c';而string声明赋值时候可以是单字符也可以是很多个单字符连在一起组成一个串,string s...使用:已密码键盘获取密码输入为例 函数说明:int __stdcall inputpassword(unsigned char *param) .NET中使用: 声明: [DllImport("COM

2.3K110

vector使用方法_vector指针如何使用

大家好,我是架构君,一个会写代码吟诗架构师。今天说一说vector使用方法_vector指针如何使用,希望能够帮助大家进步!!! 一、什么是vector?...3.能够感知内存分配器(Allocator-aware) 容器使用一个内存分配器对象来动态地处理它存储需求。...9.capacity 当前vector分配大小 10.size 当前使用数据大小 11.resize 改变当前使用数据大小,如果它比当前使用大,者填充默认值 12.reserve 改变当前vecotr...所分配空间大小 13.erase 删除指针指向数据项 14.clear 清空当前vector 15.rbegin 将vector反转后开始指针返回(其实就是原来end-1) 16.rend 将...vector反转构结束指针返回(其实就是原来begin-1) 17.empty 判断vector是否为空 18.swap 与另一个vector交换数据 今天文章到此就结束了,感谢您阅读,Java架构师必看祝您升职加薪

2.5K20

send()、sendto()recv()、recvfrom()使用

udp通讯中sendto()需要在参数里指定接收方地址/端口,recvfrom()则在参数中存放接收发送方地址/端口,与之对应send()recv()则不需要如此,但是在调用send()之前,...(这些内容前面文章udp通讯中connect()bind()函数 有详细讲过) 这4个函数使用比较简单,但在一个实例中,遇到一个小问题。...实现功能: udp服务器创建一个套接字接收客户端连接,连接成功后,服务器再创建一个套接字与客户端进行数据交互,要求尽量使用connect()recv()、send()函数。...recv()send() if ((ret = connect(cli_sd, (struct sockaddr* )&cli_addr, addrlen)) < 0) { perror("connect...()、recv()三个函数搭配使用并不能说一定能代替sendto()、recvfrom(),具体使用还要依据代码场景。

1.5K20

C++ 中vector使用方法

作用:它能够像容器一样存放各种类型对象,简单地说,vector是一个能够存放任意类型动态数组,能够增加压缩数据。...vector在C++标准模板库中部分内容,它是一个多功能,能够操作多种数据结构算法模板类函数库。...特别注意: 使用vector需要注意以下几点: 1、如果你要表示向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低; 2、Vector作为函数参数或者返回值时,需要注意它写法...实例:vectortest; //建立一个vector,int为数组元素数据类型,test为动态数组名 简单使用方法如下: vectortest;//建立一个vector test.push_back...(1); test.push_back(2);//把12压入vector,这样test[0]就是1,test[1]就是2 自己见到实例: vector > points

2.1K11

Vector:动态数组使用说明

对于预先不知或不愿预先定义 数组大小,并需频繁进行查找、插入删除工作情况,可以考虑使用向量类。...public Vector(int initialcapacity) 使用第一种方法,系统会自动对向量对象进行管理。...Vector类似于一个数组,但与数组相比在使用上有两个优点: ① 使用时候无须声明上限,随着元素增加,Vector长度会自动增加; ② Vector类提供额外方法来增加、...Vector类似于一个数组,但与数组相比在使用上有两个优点: ① 使用时候无须声明上限,随着元素增加,Vector长度会自动增加; ② Vector类提供额外方法来增加、删除元素...vector 是同一种类型对象集合,每个对象都有一个对应整数索引值 [2] 。 string 对象一样,标准库将负责管理与存储元素相关内存。

76610

简单方法使用注解可以执行清晰类型安全代码

(基于注解),不但可以执行清晰类型安全代码,而且还不用担心易错字符串字面值以及强制类型转换。...其实可以结合使用,接口中:简单方法使用注解,复杂方法使用xml配置。...selectBlog(int id); 1.3 作用域(Scope)生命周期 对于依赖注入框架Spring   依赖注入框架可以创建线程安全、基于事务 SqlSession 映射器(mapper...因此 SqlSessionFactoryBuilder 实例最佳作用域是方法作用域(也就是局部方法变量)。   ...所以它最佳作用域是请求或方法作用域。每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。

60520

如何优雅使用理解线程池

keepAliveTime unit 则是线程空闲后存活时间。 workQueue 用于存放任务阻塞队列。 handler 当队列最大线程池都满了之后饱和策略。...在具体分析之前先了解下线程池中所定义状态,这些状态都线程执行密切相关: RUNNING 自然是运行状态,指可以接受任务执行队列里任务 SHUTDOWN 指调用了 shutdown() 方法,不再接受新任务了...当然这些都是经验值,最好方式还是根据实际情况测试得出最佳配置。 优雅关闭线程池 有运行任务自然也有关闭任务,从上文提到 5 个状态就能看出如何来关闭线程池。...两个方法都会中断线程,用户可自行判断是否需要响应中断。 shutdownNow() 要简单粗暴,可以根据实际场景选择不同方法。...SpringBoot 使用线程池 2018 年了,SpringBoot 盛行;来看看在 SpringBoot 中应当怎么配置使用线程池。

36120

如何优雅使用理解线程池

线程池原理 谈到线程池就会想到池化技术,其中最核心思想就是把宝贵资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用,有点吃大锅饭意思。...keepAliveTime unit 则是线程空闲后存活时间。 workQueue 用于存放任务阻塞队列。 handler 当队列最大线程池都满了之后饱和策略。...当然这些都是经验值,最好方式还是根据实际情况测试得出最佳配置。 优雅关闭线程池 有运行任务自然也有关闭任务,从上文提到 5 个状态就能看出如何来关闭线程池。...两个方法都会中断线程,用户可自行判断是否需要响应中断。 shutdownNow() 要简单粗暴,可以根据实际场景选择不同方法。...SpringBoot 使用线程池 2018 年了,SpringBoot 盛行;来看看在 SpringBoot 中应当怎么配置使用线程池。

1.1K30

Proc中使用char数组、VARCHAR数组char变量进行DELETE操作具体行数细微区别

CHAR类型数组变量 EXEC SQL for :delete_rows delete FROM table_name WHERE a= :a; 由于char对应于Oraclechar类型,因此若有空格...,则此时char使用memset初始化,但也会带有后面的空格,有可能造成delete时where a=:a由于空格不匹配无法删除,例如:a赋值为'a’,但数组长度是3,因此实际where条件是a='a...类型,因此不存在1中空格问题,会自动滤掉空格,这是最好一种匹配方法。...CHAR类型变量 这里指的是char字符串变量,不是数组,此时使用: EXEC SQL for :delete_rows delete FROM table_name WHERE c= :c; 由于c只是一个变量字符串...另外,值得提一句,EXEC SQL BEGIN DECLARE SECTION;中charVARCHAR类型可以不是二维数组,但其它类型变量必须不能是这种二维数组。

1.2K50

论如何优雅使用理解线程池

线程池原理 谈到线程池就会想到池化技术,其中最核心思想就是把宝贵资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用,有点吃大锅饭意思。...keepAliveTime unit 则是线程空闲后存活时间。 workQueue 用于存放任务阻塞队列。 handler 当队列最大线程池都满了之后饱和策略。...当然这些都是经验值,最好方式还是根据实际情况测试得出最佳配置。 优雅关闭线程池 有运行任务自然也有关闭任务,从上文提到 5 个状态就能看出如何来关闭线程池。...两个方法都会中断线程,用户可自行判断是否需要响应中断。 shutdownNow() 要简单粗暴,可以根据实际场景选择不同方法。...SpringBoot 使用线程池 2018 年了,SpringBoot 盛行;来看看在 SpringBoot 中应当怎么配置使用线程池。

41530

如何优雅传递 stl 容器作为函数参数来实现元素插入遍历?

此时需要使用“模板显示实例化”在 engine_db.cpp 文件中强制模板生成对应代码实体,来 engine.cpp 中调用点进行链接。...美中不足是,模板显示实例化还有一些啰嗦,这里使用 typedef 定义要实例化类型,将上面的语句改造清晰一些: typedef std::back_insert_iterator<std::vector...使用 map 代替 vector使用过程中,发现使用 map 可以更快方便查询消息是否已经在容器中,于是决定将消息容器定义变更如下: std::map<std::string, server_msg_t...对于后面两个链接 error,百思不得其解,后来使用一个非常简单 test 模板函数做试验,发现是命名空间搞鬼,需要在每个函数定义显示实例化语句前加上命名空间限定(GCM::): template...结语 其实本文讲解了一种通用通过 iterator 读取容器、通过 inserter 插入容器元素方法,这种方式较之直接传递容器本身“优雅”不少,虽然不能实现 100% 无缝切换容器,但是也提供了极大灵活性

3.6K20

14.10 Socket 套接字选择通信

对于网络通信中服务端来说,显然不可能是一对一,我们所希望是服务端启用一份则可以选择性与特定一个客户端通信,而当不需要与客户端通信时,则只需要将该套接字挂到链表中存储并等待后续操作,套接字服务端通过多线程实现存储套接字选择通信...struct{ SOCKET client; sockaddr_in saddr; char address[128]; unsigned short port;}ClientInfo;接着我们来看主函数中实现...弹出一个套接字调用PopConnect该函数接收一个全局链表,以及一个字符串IP地址,其内部通过枚举链表方式寻找IP地址,如果找到了则直接使用ptr.erase(it)方法将找到套接字弹出链表,并以此实现关闭通信目的...address[128]; unsigned short port;}ClientInfo;std::vector info; // 全局主机列表SOCKET...void PopConnect(std::vector &ptr, char *address){ // 循环迭代器,查找需要弹出元素 for (std::vector

22840
领券