我几次尝试使用boost :: asio创建自己的简单异步TCP服务器几年后没有触及它.
我能找到的最新示例列表是:http: //www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html
我在这个示例列表中遇到的问题是(我觉得)它欺骗并且通过使tcp_connection成为shared_ptr来欺骗它,这样它就不用担心每个连接的生命周期管理了.(我认为)他们这样做是为了简洁,因为它是一个小教程,但这个解决方案不是现实世界.
如果您想在计时器或类似的东西上向每个客户端发送消息怎么办?在任何真实世界的非平凡服务器中都需要一组客户端连接.
我担心每个连接的生命周期管理.我认为自然要做的就是在tcp_server中保留一些tcp_connection对象或指向它们的指针.从OnConnect回调添加到该集合并从该集合中删除OnDisconnect.
请注意,OnDisconnect很可能是从实际的Disconnect方法调用的,在发生错误的情况下,该方法将从OnReceive回调或OnSend回调调用.
嗯,这就是问题所在.
考虑一下我们有一个看起来像这样的callstack:
tcp_connection::~tcp_connection
tcp_server::OnDisconnect
tcp_connection::OnDisconnect
tcp_connection::Disconnect
tcp_connection::OnReceive
Run Code Online (Sandbox Code Playgroud)
这会在调用堆栈展开时导致错误,并且我们正在一个已经调用了析构函数的对象中执行代码......我想,对吧?
我想每个做服务器编程的人都会以某种方式遇到这种情况.处理它的策略是什么?
我希望这个解释足够好.如果不让我知道,我将创建自己的源列表,但它将非常大.
编辑:相关
IMO不是一个可以接受的答案,依赖于在接收电话上使用shared_ptr作弊,仅此而已,并不是现实世界.如果服务器想要每5分钟对所有客户说"嗨"怎么办?某种集合是必要的.如果你在多个线程上调用io_service.run怎么办?
我也在提升邮件列表:http: //boost.2283326.n4.nabble.com/How-to-design-proper-release-of-a-boost-asio-socket-or-wrapper-thereof- td4693442.html
我正在制作一个客户端套接字。
为了让我的测试人员更轻松,我想指定套接字将使用的网卡和端口。
昨天,在我的谷歌搜索中,我发现:Binding boost asio to local tcp endpoint
通过执行 open、bind 和 async_connect,我能够绑定到特定的网卡,并且我开始在 Wireshark 中看到流量。
但是,Wireshark 报告套接字已被赋予一个随机端口,而不是我指定的端口。我想如果端口正在使用它会填写传递给绑定方法的 error_code 。
我究竟做错了什么?
这是我的最小示例,从我的真实解决方案中提取和编辑。
// Boost Includes
#include <boost/asio.hpp>
#include <boost/atomic.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/thread/condition_variable.hpp>
// Standard Includes
#include <exception>
#include <memory>
#include <string>
#include <sstream>
boost::asio::io_service g_ioService; /** ASIO sockets require an io_service to run on*/
boost::thread g_thread; /** thread that will run the io_service and hence where callbacks are called*/
boost::asio::ip::tcp::socket g_socket(g_ioService); /** Aync socket*/
boost::asio::ip::tcp::resolver g_resolver(g_ioService); /** …Run Code Online (Sandbox Code Playgroud) 我是一个没有"网络东西"经验的C++人,但我的主管要我去学习"ASP.NET MVC 6"的方法,因为它是最新的时髦的东西.
我设法得到至少一个教程,但我看不到任何参考和任何文档.我在哪里查找有哪些类和方法?
我目前的问题是我试图弄清楚如何从我的控制器中的Create方法返回一个409的Http状态.我没有看到HttpConflict方法.我该怎么称呼?
我试图将我的问题缩小到一个最小的例子:
#include <algorithm>
#include <map>
#include <string>
#include <vector>
int main()
{
std::vector<int> result;
std::map<std::string, std::pair<unsigned int, std::vector<int>>> other;
if (true)
{
std::for_each(other.begin(), other.end(),
[&](std::pair<std::string, std::pair<unsigned int, std::vector<int>>> & data)
{
result.insert(result.end(), data.second.second.begin(), data.second.second.end());
});
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
error C2664: 'void main::<lambda_1b93236899a42921c1aec8d5288e5b90>::operator ()(std::pair<std::string,std::pair<unsigned int,std::vector<int,std::allocator<_Ty>>>> &) const': cannot convert argument 1 from 'std::pair<const _Kty,_Ty>' to 'std::pair<std::string,std::pair<unsigned int,std::vector<int,std::allocator<_Ty>>>> &'
Run Code Online (Sandbox Code Playgroud)
据我所知,lambda参数确实是对我们正在迭代的地图所包含的类型的引用.这是我应该使用的类型,对吧?
如果我在data编译之前删除了amperstand .
为什么?
我不想按值传递每个元素,因为这些集合将在我的真实程序中包含大量数据.
如果我用auto &它编译替换lambda param,这会让我相信lambda param中的类型与map中包含的类型不匹配,但它看起来确实对我有用.另外,为什么原始编译没有&如果类型错误?
我错过了什么/不理解?
我有一个使用winsock 与另一个使用winsock 的Windows 服务进行通信的Windows 服务。我们正在使用 JSON 通过 TCP/IP 进行讨论。
我试图证明我的服务运行正常,并且它所通信的服务没有发送预期的数据。
我设置了wireshark来捕获我在本地计算机上使用的以太网卡并过滤ip.addr ==,我可以看到流量。
我期待包含“消息一”的消息,并且我可以看到它们,数千条。当我收到所有这些信息时,我希望收到一些包含“消息二”的消息
如何设置过滤器来证明我没有收到“消息二”消息?
我用谷歌搜索了一下,有人说使用数据文本行包含“消息二”,但这不起作用。我可以通过查看包含“消息一”的消息,然后过滤包含“消息一”的数据文本行来验证它不起作用,并且它们在不应该消失时全部消失。我有一种感觉,只适合http。
我用什么来过滤?
编辑 - 要回复 vj 的回复并能够上传图片:
我没有看到“表达式”按钮。这是一些屏幕截图。
当您创建一个接口并且您知道您将依赖另一个接口时,您是否将构造函数作为接口的一部分?
就我而言,我想创造
我可以给客户端的IClientReceiveRecorder,并为短暂的测试会话收集所有网络流量.它可能只包含一组字符串.
一个IEvaluator,可以获取收到的所有消息并实现我们想要测试的各种内容.例如,我可能有一个具体的Evaluator来测试所有字符串是否包含字母'c'.
我知道任何IEvaluator都需要一个IClientReceiveRecorder来获取它要评估的消息.
所以,我看到了一些选择.我会做点什么吗?
interface IEvaluator
{
IEvaluator(IClientReceiveRecorder);
void Evaluate();
}
Run Code Online (Sandbox Code Playgroud)
它不编译,所以我猜不是.
也许我会这样做
interface IEvaluator
{
void Evaluate(IClientReceiveRecorder);
}
Run Code Online (Sandbox Code Playgroud)
或者,我是否只是将它留给具体类来在其构造函数中使用IClientReceiveRecorder?
我经常遇到这样的情况:我们创建了一个作用于某些枚举的类,但后来我们派生并希望在不更改基类的情况下向枚举添加更多值。
我从 2009 年看到这个问题: Base enum class继承
但是,我知道 C++11、14、17 中对枚举进行了许多更改。这些更改中的任何一个是否允许将枚举从基类扩展到派生类?
class Base
{
enum State {STATE_1, STATE_2, STATE_3};
};
class Derived : public Base
{
enum State {STATE_4};
};
Run Code Online (Sandbox Code Playgroud)
...我们希望派生有一个枚举来描述它可以处于的状态,即:STATE_1、STATE_2、STATE_3 和 STATE_4。我们真的不想更改基类中的枚举,因为其他派生类可能无法处于 STATE_4 中。我们也不想创建一个新的枚举,因为我们已经在 Base 中为 State 建立了一个枚举。
为了在 8 年后实现这一目标,我们是否仍然使用静态常量值?
class Base
{
static int STATE_1= 0;
static int STATE_2= 1;
static int STATE_3= 2;
};
class Derived : public Base
{
static int STATE_4= 3;
};
Run Code Online (Sandbox Code Playgroud) from enum import Enum
class InputTypes(Enum):
"""
Flags to represent the different kinds of input we
are acting on from the user
"""
KEYBOARD = 0b00000001,
MOUSE_BUTTONS = 0b00000010,
MOUSE_MOVE = 0b00000100,
ALL = 0b11111111
if __name__ == "__main__":
x = (InputTypes.KEYBOARD | InputTypes.MOUSE_BUTTONS)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
TypeError: unsupported operand type(s) for |: 'InputTypes' and 'InputTypes'
Run Code Online (Sandbox Code Playgroud)
如何在 python 2.7 和 python3 中正确定义一些标志并使用它们?
我有一个进行图像比较的 C 库和调用它的 Python。我在 AWS-Lambda 功能列表中没有看到 C 或 C++ 运行时。然而,Python 本身不是调用 C 的吗?我以为翻译其实是C?我们可以在 AWS-Lambda 上运行从 Python 调用的 C 库吗?
我遇到的情况是 grpc 通信的另一端与其发布的版本不同步。我的上司,因此希望我添加一个字段,如果对方填写或不填写,该字段将在短时间内(如两周)有效
我相信我可以通过将它添加到 proto 消息的末尾来做到这一点,这样其他字段的索引就不会改变。根据我在 Google 上搜索的内容,可选字段在 3.15 版之前不可用,因此我必须使用变通方法。
向我描述的解决方法是使用oneof. 但是,我不能 100% 确定那是什么样子。所有示例都单独显示 oneof 字段。属于 oneof values 的索引是否缩进属于消息其余部分的索引?
message TestMessage {
string somefield = 1;
int someotherfield = 2;
oneof mynewoptionalfield
{
string mynewfield = ???? Does this have to be 3 or is it 1?
int ifihadanother = ???? Does this need to be 4 or 2?
}
}
Run Code Online (Sandbox Code Playgroud)
问题: