首页
学习
活动
专区
工具
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。...对于CHAR和STRING类型的区别本来找到个说的比较好的文章,但是回到家里后就找不到那文章了。...他们的区别就是字符和字符串的区别,char 声明并赋值的时候只能是单字符的,char c = 'c';而string声明和赋值的时候可以是单字符也可以是很多个单字符连在一起组成一个串,string s...使用:已密码键盘获取密码输入为例 函数说明:int __stdcall inputpassword(unsigned char *param) .NET中使用: 声明: [DllImport("COM

2.4K110

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.8K20
  • 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.8K20

    C++ 中vector的使用方法

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

    2.4K11

    Vector:动态数组的使用和说明

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

    78110

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

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

    61620

    Tcp多人聊天窗口:MFC客户端(2)

    基础逻辑和单人聊天一样, void ClubNumberInit(std::vectorunsigned short> vec_list); //人员列表初始化 afx_msg void OnBnClickedButton1...short usID,std::vectorunsigned short> m_list) { std::vectorunsigned short>::iterator iter_find =...* ClientRecv(char * Buf_Recv);//客户端接收 void ClientSend(char * Buf_Recv,int Msg_len);//客户端发送 private:...* TcpNetWork::ClientRecv(char * Buf_Recv) { int iRet = recv(ClientSocket,Buf_Recv,MAXLEN,0); return...比如:只实现了主体功能,一些,用户注册,用户登录,用户注销,列表的动态维护,创键群组,删除群组,等其他功能,虽然只是简单的周边的功能,调用现有函数均可实现,Tcp服务端的TCP网络模型的使用,是Tcp服务端容错率

    2.1K20

    如何优雅的使用和理解线程池

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

    38120

    如何优雅的使用和理解线程池

    线程池原理 谈到线程池就会想到池化技术,其中最核心的思想就是把宝贵的资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用,有点吃大锅饭的意思。...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对应于Oracle的char类型,因此若有空格...,则此时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;中char和VARCHAR类型可以不是二维数组,但其它类型的变量必须不能是这种二维数组。

    1.2K50

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

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

    41930

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

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

    3.7K20

    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

    23940

    在 .NET 6 中使用 Startup.cs 更简洁的方法

    如果您在关注 .NET 6,那么您应该知道,在 .NET 6 项目中,没有 Startup.cs 文件,现在使用了 Program.cs 文件来完成统一的配置。...我之前发了一篇使用在 .NET 6 项目中使用 Startup.cs 的文章。 在 .NET 6 项目中使用 Startup.cs 能否能进一步改进,让它变得更好呢?...当然可以,接下来,我会展示一种更为简洁的方法。 为了让代码看上去更简洁,我使用了扩展方法。在 .NET 6 中,使用WebApplicationBuilder 构建程序。...所以,我们为 WebApplicationBuilder 和 WebApplication 创建扩展方法。...最后,更新项目的 Program.cs 使用这些扩展方法。 或者,直接使用一行代码完成这些工作。 现在,代码看起来更简洁、可读,且易于管理。

    1.5K40
    领券