小编Chr*_*isz的帖子

如何设计boost :: asio套接字或其包装的正确释放

我几次尝试使用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)

这会在调用堆栈展开时导致错误,并且我们正在一个已经调用了析构函数的对象中执行代码......我想,对吧?

我想每个做服务器编程的人都会以某种方式遇到这种情况.处理它的策略是什么?

我希望这个解释足够好.如果不让我知道,我将创建自己的源列表,但它将非常大.


编辑:相关

)异步C++代码中的内存管理

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

c++ tcp boost-asio

5
推荐指数
1
解决办法
1096
查看次数

boost::asio::ip::tcp::socket - 如何绑定到特定的本地端口

我正在制作一个客户端套接字。

为了让我的测试人员更轻松,我想指定套接字将使用的网卡和端口。

昨天,在我的谷歌搜索中,我发现: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++ sockets boost tcp boost-asio

5
推荐指数
1
解决办法
5617
查看次数

MVC6中的HttpConflict在哪里?

我是一个没有"网络东西"经验的C++人,但我的主管要我去学习"ASP.NET MVC 6"的方法,因为它是最新的时髦的东西.

我设法得到至少一个教程,但我看不到任何参考和任何文档.我在哪里查找有哪些类和方法?

我目前的问题是我试图弄清楚如何从我的控制器中的Create方法返回一个409的Http状态.我没有看到HttpConflict方法.我该怎么称呼?

asp.net-core-mvc

4
推荐指数
2
解决办法
3591
查看次数

Lambda和map,param by reference - 编译错误

我试图将我的问题缩小到一个最小的例子:

#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中包含的类型不匹配,但它看起来确实对我有用.另外,为什么原始编译没有&如果类型错误?

我错过了什么/不理解?

c++ lambda c++11

4
推荐指数
1
解决办法
200
查看次数

Wireshark - 如何过滤未通过 HTTP 发送的 JSON 内容

我有一个使用winsock 与另一个使用winsock 的Windows 服务进行通信的Windows 服务。我们正在使用 JSON 通过 TCP/IP 进行讨论。

我试图证明我的服务运行正常,并且它所通信的服务没有发送预期的数据。

我设置了wireshark来捕获我在本地计算机上使用的以太网卡并过滤ip.addr ==,我可以看到流量。

我期待包含“消息一”的消息,并且我可以看到它们,数千条。当我收到所有这些信息时,我希望收到一些包含“消息二”的消息

如何设置过滤器来证明我没有收到“消息二”消息?

我用谷歌搜索了一下,有人说使用数据文本行包含“消息二”,但这不起作用。我可以通过查看包含“消息一”的消息,然后过滤包含“消息一”的数据文本行来验证它不起作用,并且它们在不应该消失时全部消失。我有一种感觉,只适合http。

我用什么来过滤?


编辑 - 要回复 vj 的回复并能够上传图片:

我没有看到“表达式”按钮。这是一些屏幕截图。

分析菜单 显示过滤器...

wireshark

4
推荐指数
1
解决办法
1万
查看次数

接口依赖性

当您创建一个接口并且您知道您将依赖另一个接口时,您是否将构造函数作为接口的一部分?

就我而言,我想创造

我可以给客户端的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?

c# oop

4
推荐指数
2
解决办法
174
查看次数

枚举支持继承

我经常遇到这样的情况:我们创建了一个作用于某些枚举的类,但后来我们派生并希望在不更改基类的情况下向枚举添加更多值。

我从 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)

enums c++11 c++14 c++17

3
推荐指数
1
解决办法
4731
查看次数

如何在 Python 中使用按位标志

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 中正确定义一些标志并使用它们?

python bitflags python-2.7

3
推荐指数
1
解决办法
3584
查看次数

AWS-Lambda 可以使用调用 C 的 Python 吗?

我有一个进行图像比较的 C 库和调用它的 Python。我在 AWS-Lambda 功能列表中没有看到 C 或 C++ 运行时。然而,Python 本身不是调用 C 的吗?我以为翻译其实是C?我们可以在 AWS-Lambda 上运行从 Python 调用的 C 库吗?

aws-lambda

3
推荐指数
1
解决办法
1605
查看次数

grpc 和 protobuf - 当另一方未同步发布时如何处理新字段

我遇到的情况是 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)

问题:

  • 我在哪里使用的索引是什么???标记是
  • 当另一方不打算重新编译和部署对原型文件的更改时,这是正确的解决方法吗?
  • 然后如何检查该字段是否已填写在我的 C++ 代码中?

protocol-buffers grpc

2
推荐指数
1
解决办法
94
查看次数