c++ - 将大字符串发送到套接字

标签 c++ string sockets

我是 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/

相关文章:

安卓 Wifip2p : Why is group info null after connecting to group owner

java - 我在socket上设置了超时,发现这个值不能大于21

Java Sockets - 读取服务器获取的数据的客户端

c++ - 我可以在 C++ 中从另一个构造函数调用构造函数(进行构造函数链接)吗?

c++ - Visual Studio 2010 C++/w Google Protocol Buffer 。找不到 60 个外部对象。无法编译

c++ - Doxygen:是否可以去除 CHM 索引中的命名空间名称?

python - 在结构化数组中查找 header 名称的一部分的 header 索引

c++ - 将自适应阈值化应用于范围内函数opencv c++

string - Lua 字符串长度(utf8 中的西里尔字符)

java - 如何在 strings.xml 中输入字符 "<"?