使用recv()和vector<unsigned char>的更优雅的方法是使用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++的面向对象特性来处理网络通信。此外,它还提供了一个更简洁、易用的接口,使得我们可以更容易地处理接收到的数据。
领取专属 10元无门槛券
手把手带您无忧上云