在客户端-服务器程序中,服务器是否可以使用 write() 函数向客户端写入多行?

In a client-server program, is it possible for the server to write multiple lines to the client, using the write() function?

例如,如果客户端向服务器询问特定对象的最大和最小尺寸,则服务器需要用这两个变量来回复客户端的请求。是否可以从服务端发送两个字符串给客户端输出?

是的,这是可能的。您可以使用 write() 来写入多个字节。你只需要在一个连续的区域收集数据,然后处理一个指向该区域的指针来写入,当然还有要写入的数据数量。

也可以循环调用write来写入不同的区域

一个连续的区域也可以有大小1。意思是,你可以一个字节一个字节地写入。在一个循环中。或者作为单个语句。

要构建数据区,您可以使用不同的 STL 容器,例如 std::stringstd::vector。要访问数据,您可以使用成员函数(如 c_str()data();

如果你想拥有完全的自由,你可能想要使用一个std::ostringstream。在这里您可以像 std::cout 一样插入数据,然后将结果写入任何地方。

我给你准备了一个例子

请注意。作为文件描述符,我使用 1。这相当于 std::cout。所以你会在控制台看到程序的结果。

#include <io.h>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>


// File descriptor. For test purposes we will write to the console
constexpr int testFdforStdOut = 1;

int main()
{
    // String parts
    std::string part1("Part1\n");
    std::string part2("Part2\n");
    std::string part3("Part3\n");
    // Combine all strings
    std::string allData = part1 + part2 + part3;
    // Write all data
    _write(testFdforStdOut, allData.c_str(), allData.size());

    // Vector of strings
    std::vector<std::string> vectorOfStrings{ "\nPart4\n", "Part5\n", "Part6\n", "Part7\n" };
    // Write data in a loop
    for (const std::string&s : vectorOfStrings)
        _write(testFdforStdOut, s.c_str(), s.size());

    std::ostringstream oss;
    oss << "\nTest for anything\n" << 2 << '\n' << 3 * 3 << "\nPart8\n";
    _write(testFdforStdOut, oss.str().c_str(), oss.str().size());

    return 0;
}