如何使用C++标准库网络TS在服务器和客户端之间发送消息

4
我曾经尝试按照来自 boost 的教程操作,但是该API并不完全相同,因此我不得不猜测某些部分。

到目前为止,我所做的尝试如下所示:

#include <iostream>
#include <experimental/internet>
#include <experimental/socket>
#include <thread>
#include <chrono>

using namespace std::experimental;

int main(int argc, char* argv[])
{

    std::thread server = std::thread([]()
    {
        std::cout << "Starting server" << std::endl;

        net::io_context context;
        net::ip::tcp::endpoint endpoint{net::ip::tcp::v4(), 1234};
        net::ip::tcp::acceptor acceptor{context, endpoint};
        acceptor.non_blocking(true);
        std::cout << "opened server on " << endpoint << std::endl;
        std::error_code error;
        net::ip::tcp::socket socket(context);
        while (true)
        {
            socket = acceptor.accept(error); //accept connections
            if (!error) //if connected with a client
            {
                std::cout << "Connected to client!" << std::endl;

                std::this_thread::sleep_for(std::chrono::seconds(2));
                std::string data = "Hello World!";
                net::const_buffer buf(&data, sizeof(data));
                socket.send(buf);
                std::cout << "Sent data!" << std::endl;
                while(true) {}
            }
        }
    });


    std::thread client = std::thread([]()
    {
        net::io_context context;
        net::ip::tcp::socket socket(context);

        net::ip::tcp::endpoint server{net::ip::tcp::v4(), 1234};
        std::error_code error;
        while(true)
        {
            socket.connect(server, error); //attempt to connect
            if (!error) //if connected
            {
                std::cout << "Connected to server!" << std::endl;
                net::mutable_buffer buf;
                while(buf.size() == 0)
                {
                    socket.receive(buf);
                }
                std::cout << "Received data!" << std::endl;
                std::cout << buf.data() << std::endl;
                while(true) {}
            }
        }

    });

    server.join();

    return 0;
}

服务器和客户端连接成功,但是客户端未收到消息。程序的输出如下:
Starting server
opened server on 0.0.0.0:1234
Connected to server!
Connected to client!
Sent data!

然后它就永远等待。

我该如何使套接字正确地接收数据?


1
“net::const_buffer buf(&data, sizeof(data));” - 鉴于“data”是一个“std::string”对象,这行代码是错误的。正确的写法应该是“buf(data.data(), data.size())”。 - Igor G
1个回答

3

This

std::string data = "Hello World!";
net::const_buffer buf(&data, sizeof(data));

出错了。您希望发送data字符串的内容,而不是它的内部字节。 &data会给您一个指向字符串实例底层数据的指针,并非其内容。如果您想创建表示data内容的缓冲区,则可以执行以下操作:

const std::string data = "Hello World!";
net::const_buffer buf = net::buffer(data);

抱歉,您需要提供更多需要翻译的内容。
net::mutable_buffer buf;
while(buf.size() == 0)
{
    socket.receive(buf);
}

原因是buf的初始大小为0,所以receive读取了0个字节并返回,导致无限循环。然后检查while条件时,buf的大小仍然为0,循环继续执行。

在调用receive之前,您需要指定缓冲区的大小-它指示必须读取多少字节。您正在发送Hello World!,因此

std::string msg;
msg.resize(12); // prepare space for incoming data
net::mutable_buffer buf = net::buffer(msg);
socket.receive(buf);
std::cout << "I got: " << msg << std::endl;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接