首页 > 解决方案 > 在客户端-服务器程序中,服务器是否可以使用 write() 函数向客户端写入多行代码?

问题描述

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

标签: c++c++11operating-systemclient-serverposix

解决方案


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

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

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

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

如果您想拥有完全的自由,您可能需要使用std::ostringstream. 在这里,您可以像 in 一样插入数据std::cout,然后通过 write 将结果发送到任何地方。

我为你准备了一个例子。

请注意。作为文件描述符,我使用 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;
}

推荐阅读