我是 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;
}
现在想象一下,我们有 std::string data
而不是 const void *data
。问题是如何使用 std::string
将指针移动到像这样的 data_ptr += bytes_sent;
数据中?
我得出的一种方法是检索 std::stirng
的行指针,将其保存在一些 const char * var
中,然后以相同的方式使用该变量(var += bytes_sent
)。但是由于我是 C++ 的新手,我不知道这是否是这样做的“C++ 方式”?这是这个问题的最佳解决方案还是有更好的解决方案?谢谢
最佳答案
是的,这是最好的方法。
无论如何,您必须获得指向数据的指针,才能使用发送
,因此只需根据需要调整指针即可。
类似于:
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()
);
}
关于c++ - 将大字符串发送到套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56476251/