Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 端点、套接字、接受器之间的差异_C++_Sockets_Boost Asio - Fatal编程技术网

C++ 端点、套接字、接受器之间的差异

C++ 端点、套接字、接受器之间的差异,c++,sockets,boost-asio,C++,Sockets,Boost Asio,我试图理解使用套接字进行网络编程的概念 据我所知,与电话交谈有相似之处 端点将是电话号码 把电话和电话插座插上 接受者是接电话的人 那么 套接字绑定到端点(手机连接到插头)和 Acceptor可以访问套接字和处理程序 (一个人被放在电话旁边,并得到一个任务,如果有人打电话怎么办) 如果这是一个有效的可视化,那么为什么您可以将接受者直接绑定到端点,然后将套接字提供给接受者?还是上述观点显然是错误的 tcp::endpoint ep(boost::asio::ip::address::fro

我试图理解使用套接字进行网络编程的概念

据我所知,与电话交谈有相似之处

  • 端点将是电话号码
  • 把电话和电话插座插上
  • 接受者是接电话的人
那么

  • 套接字绑定到端点(手机连接到插头)和

  • Acceptor可以访问套接字和处理程序 (一个人被放在电话旁边,并得到一个任务,如果有人打电话怎么办)

如果这是一个有效的可视化,那么为什么您可以将接受者直接绑定到端点,然后将套接字提供给接受者?还是上述观点显然是错误的

tcp::endpoint ep(boost::asio::ip::address::from_string("192.168.XXX.XXX"), portNumber);
tcp::acceptor a(io_service);
tcp::socket s(io_service);

a.open(ep.protocoll());
a.bind(endpoint);
a.listen(boost::asio::socket_base::max_connections);
a.async_accept(s, myHandler);

你的等价性不够准确。将接受器视为一种被动套接字:它只是等待另一个端点的套接字请求连接,它是只读的。当接受器“读取”请求时(即,当相应的i/O事件触发时),它将分支连接到远程端点的新套接字,并将所有进一步的i/O工作委托给它。然而,接受者本身却处于被动状态。

我感觉到了你的痛苦。 我不喜欢boost::asio框架中使用的抽象或api。 这就是我目前的处境

端点是ip地址和端口

套接字是工程意义上的通道概念的抽象。它就像两部电话之间的电线,或者两个天线之间的空气。它由发送方和接收方两个端点定义

接受器是设置套接字(通道)的东西。更好的名字可能是listener,不过我更喜欢不以-er结尾的名字。请告知你是否能找到一个好的候选人。我在寻找一个更好的名字来描述接受者时发现了这篇文章。也许“接受者”是个好名字,因为它是一类物理事物的抽象。例如,卫星天线可以用作接收器

由于您身处boost::asio的国度,您可能会发现将io_服务视为eventLoop会更好。那件事也让我烦恼


你可能会发现从客观主义(一个哲学流派)研究无效概念的想法很有价值。在命名事物的挑战和认识论(知识的原则)之间似乎有一种对应关系。

好吧,你在联系你之前先打电话,对吗?因此,对我来说,在尝试连接套接字之前,给接受者一个端点似乎是合适的。为什么它们是否具有可比性很重要?你在使用asio时有什么实际问题吗?我使用的是
s.bind()
,然后是
a.async\u accept(s,myHandler)
,它抛出了一些
boost::exception\u detail::clone\u impl
,所以我想,也许我对这件事的理解是错误的。我不明白套接字和接受器之间的区别接受器绑定到本地地址。就好像你有多个电话一样。你告诉接受者:听这个电话,但忽略其余的。因此,当连接到来时,接受者决定“是的,调用是针对我的开发人员的”,然后它创建一个套接字,以便您(开发人员)可以使用它。这有帮助吗?我认为你最好解释一下你是如何使用asio的,以及你(在问题本身中)遇到了什么错误,而不是试图强迫你与其他物理对象进行比较。谢谢你的建议,但这基本上是我一直在做的。我现在希望能有一个直观的理解,这样我就可以通过思考来解决问题,而不是通过谷歌搜索我想采取的每一步。因此,接受者更像是一部手机,当它收到请求(被呼叫)时,它会激活插座(可以做事情的活跃的人),而插座是活跃的部分,然后它会使用处理程序来知道它必须做什么。这样更好吗?你可能会把接受者想象成一个秘书的电话,等待来电。如果有人打秘书的电话,他/她将把电话转接给首席执行官的电话。然后,老板可能会进行对话、挂断电话或回电话。然而,秘书从未主动打过电话。