草庐IT

ZN5boost

全部标签

c++ - Boost::ASIO - 如何使用 2 个线程来处理接收和发送消息

我正在为Windows客户端使用Boost::ASIO版本1.52.0。我希望能够专用一个线程来处理所有从服务器接收的消息,然后另一个专用线程来处理所有传出到服务器的消息。我现在为两个线程使用相同的io_service对象。我担心的是,当io_service::run()方法被调用时,处理传出消息的线程可能会被安排处理一些传入消息调用,反之亦然-反之亦然。所以,我的问题-这可能吗?如果是,那么使用第二个io_service对象是否可以解决问题——每个线程一个?有没有更好的方法来设计这个?我试图避免对读取和写入处理程序使用多个线程。我想确认的另一件事是-我读到如果2个或更多async_r

c++ - 了解 TCP 数据包大小限制和 UDP 数据包大小限制及其在 boost::asio 编程级别的含义

我正在使用boost::asio在我的客户端应用程序和服务器应用程序中执行UDP以及TCP通信。我发现我只能使用UDP传输大小为65535字节的数据,因为它似乎是UDP中的最大数据包大小。TCP中也有最大数据包大小限制,即65535字节?但是我可以在TCP中使用boost::asio::write发送大于最大数据包大小的block,并在客户端应用程序上读取它。我看到我不必担心TCP中的最大数据包大小,但在UDP中我确保每个socket.send_to都使用小于maxpacketsize的缓冲区完成>这是如何工作的?这是因为TCP是基于流的,负责在较低层创建数据包吗?有什么方法可以增加U

c++ - boost asio : unable to acknowledge a file transfer

我正在使用boostasio通过TCP执行文件传输。文件传输有效,但是当我决定通过链接async_write(在服务器上)和async_read_until(在客户端上)实现从服务器到客户端的简单确认消息时,我观察到奇怪的行为:服务器端不再正确接收文件。在传输结束前几百个字节,服务器不再接收任何字节,因此永远不会调用负责确认文件传输的async_write。这似乎发生在我写完文件后在客户端调用async_read_until时。由于某种原因,它会影响当前的文件传输。客户端实现:#include"StdAfx.h"#include#include#include#include#incl

c++ - boost asio TCP 服务器必须绑定(bind)到 IP 地址?

我不确定自己是否正确使用了BOOSTASIO,我的代码如下,boost::asio::ip::tcp::resolverresolver(io_);boost::asio::ip::tcp::resolver::queryquery(std::string("127.0.0.1"),port);boost::asio::ip::tcp::endpointendpoint=*resolver.resolve(query);acceptor_.open(endpoint.protocol());它绑定(bind)到127.0.0.1。当客户端从外部连接时,客户端使用IP地址192.168.

c++ - 通过 boost tcp 传输文件

我想通过LAN通过tcp传输一些文件,所以我为我的TX-Part编写了以下代码:voidsend_data(char*filename,char*dest){try{boost::asio::io_serviceio_service;chardest_t=*dest;std::stringadr=ip_adr_display[0]+':'+boost::lexical_cast(PORTNUM_TCP_IN);std::cout和接收部分:voidrec_data(void){try{std::cout使用以下服务器和客户端代码:usingboost::asio::ip::tcp;cl

c++ - 通过 Boost TCP 发送大量数据?

我必须通过TCP从一台计算机向另一台计算机发送网格数据...这些网格可能相当大。我很难思考通过TCP发送它们的最佳方式是什么,因为我对网络编程知之甚少。这是我需要放入缓冲区以通过TCP发送的基本类结构:classPrimitiveCollection{std::vectorprimitives;};classPrimitive{PRIMTYPESprimType;//PRIMTYPESisjustanenumwithvaluesforfan,strip,etc...unsignedintnumVertices;std::vectorvertices;};classVertex{floa

c++ - Boost-asio 在单个 (TCP) 接受器上监听多个 IP 地址

boostTCP接受器可以通过使用端点构造函数连接起来,端点构造函数只接受端口号作为参数,在这种情况下,它将监听所有IP地址/NIC。是否有可能让接受者收听选定的IP地址?或者我是否必须为我感兴趣的每个IP地址创建一个接受器?查看文档,我找不到任何迹象表明这是可能的。我已经好几年没看过套接字API了,但我猜API并没有直接允许这样做。 最佳答案 有无限制的聆听和有限制的聆听。unbound意味着你听所有的NICs,绑定(bind)-到特定的一个。不可能选择一些NIC,我认为因为同样的情况可以通过为每个NIC提供专门的接受器来实现

c++ - 使用 boost::asio 是否有一种可移植的方法来查找空闲端口号

我目前正在尝试找出一种方法来查找空闲端口的数量以建立连接,最好使用boost::asio。这个端口号将被用来监听(只有这样我才能打开一个套接字)。大概有什么办法可以做到tcp::resolver::queryquery("localhost",port);端口留空的地方(设置为0不起作用)之前看到的选项都不是可移植的或高效的。 最佳答案 处理此问题的最佳方法是让操作系统在套接字绑定(bind)到端口时随机选择一个可用端口。告诉套接字绑定(bind)到端口0,然后查询套接字以获取它绑定(bind)到的实际端口(如果成功)。不要试图提前

c++ - 当使用 Boost ASIO 时,有效载荷在 MTU 范围内拆分为两个 TCP 数据包

我对boost::asio::ip::tcp::iostream有疑问。我正在尝试发送大约20个原始字节。问题是这个20字节的有效载荷被分成两个TCP数据包,先是1字节,然后是19字节。简单的问题,为什么会发生我不知道。我正在为遗留二进制协议(protocol)编写此代码,该协议(protocol)非常需要有效负载适合单个TCP数据包(呻吟)。从我的程序中粘贴整个源代码会很长而且过于复杂,我已经在此处的2个函数中发布了功能问题(经过测试,它确实重现了该问题);#include//BEGINcygwinnastyness//Thefollowingmacrosandconditionsa

c++ - socket.connect 和 boost::asio::connect 之间的区别

我正在使用boost::asio进行网络通信,我想知道为什么在示例中有时是socket.connect(endpoint)而有时是boost::asio使用::connect(socket,endpoint)。根据代码,boost::asio::connect在循环中为端点迭代器调用socket.connect。所以我的问题是:哪个行为更好?使用boost::asio::connect还是socket.connect?我个人更喜欢socket.connect,因为我只有一个端点。或者我可能错了,误解了asio库。我的第二个问题是,为什么端点是一个迭代器?当给定1个ip和1个端口时,怎么