【发布时间】:2017-05-10 04:48:42
【问题描述】:
我正在尝试使用以下代码将std::vector<unsigned char> 通过boost::asio::ip::udp 从我的服务器应用程序同步发送到客户端应用程序,如下所示:
boost::system::error_code ignored_error;
std::vector<unsigned char> buf_data;
std::size_t len = socket.send_to(boost::asio::buffer(buf_data), remote_endpoint, 0, ignored_error);
这会导致挂起 & socket.send_to 永远不会返回。
但是,如果我尝试发送如下所示的结构,它会很好地工作
struct MyStruct
{
char name[1024];
int age;
};
boost::system::error_code ignored_error;
MyStruct send_data = {"something", 123 };
std::size_t len = socket.send_to(boost::asio::buffer(&send_data, sizeof(send_data)), remote_endpoint, 0, ignored_error);
另外,如果我尝试发送如下所示的 std::string,它也可以正常工作。
在传递 std::vector<unsigned char> 时调用 socket.send_to 有什么不同? socket.send_to 与 std::vector<unsigned char> 一起使用还是应该使用其他方式发送字符?
PS: 我要发送的矢量大小是buf_data.size() is 140050
&
我在 OSX 上
【问题讨论】:
-
在您的示例中,
buf_data不包含任何数据。还有为什么你会忽略error_code?它的存在是有原因的。 -
从未使用过asio,但vector是非POD类。你想发送对象代表的数据,对吧?那不是
buf_data.data()吗? -
@PaulMcKenzie 缓冲区对
std::vector有过载,足够聪明,可以同时提取数据和大小。 -
“这会导致挂起,并且 socket.send_to 永远不会返回。” should not happen。请提供重现问题的 SSCCE。 /cc @PaulMcKenzie
-
太棒了。我希望你知道为什么 SSCCE 是必不可少的:问题完全围绕着发送方是问题的错误假设。不是。
标签: c++ sockets c++11 udp boost-asio