我是C ++的新手,因此遇到了这个问题。我正在尝试将大字符串发送到套接字。我已经在堆栈上看到了类似的问题,但是找不到真正的答案。例如:
Sending a long String over a Socket C++
Send a string with sockets in C++ (Winsock TCP/IP)
C++ sending string over socket
其中大多数依赖于send
将在一次呼叫中发送全部数据的事实,或者他们将使用char *
而不是std::string
。
以下是用C语言编写的小代码:
int SendAll(SOCKET client_socket, const void *data, int data_size)
{
const char *data_ptr = (const char*) data;
int bytes_sent;
while (data_size > 0)
{
bytes_sent = send(client_socket, data__ptr, data_size, 0);
if (bytes_sent == SOCKET_ERROR)
return -1;
data_ptr += bytes_sent;
data_size -= bytes_sent;
}
return 1;
}
现在想象一下,我们有const void *data
而不是std::string data
。问题是如何使用data_ptr += bytes_sent;
将指针移动到像std::string
这样的数据中?
我出现的一种方法是检索std::stirng
的行指针,将其保存在const char * var
中,然后以相同的方式使用该变量(var += bytes_sent
)。但是由于我是C ++的新手,所以我不知道这是否是“ C ++方式”吗?这是解决此问题的最佳解决方案,还是有更好的解决方案?谢谢
答案 0 :(得分:5)
是的,那是最好的方法。
无论如何,您都必须获取指向数据的指针,才能使用send
,因此只需根据需要调整指针即可。
类似的东西:
int SendAll(SOCKET client_socket, const std::string& str)
{
const char* data_ptr = str.data();
std::size_t data_size = str.size();
int bytes_sent;
while (data_size > 0)
{
bytes_sent = send(client_socket, data_ptr, data_size, 0);
if (bytes_sent == SOCKET_ERROR)
return -1;
data_ptr += bytes_sent;
data_size -= bytes_sent;
}
return 1;
}
这很好,很惯用。
如果要保留函数的两个版本,只需将字符串的缓冲区转发到现有的重载即可:
int SendAll(SOCKET client_socket, const std::string& str)
{
return SendAll(
client_socket,
reinterpret_cast<const void*>(str.data()),
str.size()
);
}
答案 1 :(得分:3)
const UserSchema = new Schema({
_id: {type: ObjectId, auto: true},
username: {type: String, required: true, max:18},
email: {type: String, required: true},
password: {type: String, required: true, min:5},
date_of_registration: {type: Date, required: true},
posts: [ Schema.Types.ObjectId ]
}, { strict: false });
这是ssize_t send(int sockfd, const void *buf, size_t len, int flags);
的签名。它需要一个指向缓冲区的指针。尽管C ++ API可能更希望使用一对AWS JS SDK V3 (Lambda module) - Unable to connect to instance metadata service,而不是指针和大小,但这在这里实际上是不可能的,因为需要指向实际缓冲区的指针。因此,实际上您无能为力。您可以只使用字符串的send
成员函数将poninter插入缓冲区的开头,然后使用它。这应该很好。
iterators,您可以添加一个简单的重载来简化此操作:
data()