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++ TCP推拉式套接字服务器设计_C++_Sockets_Tcp - Fatal编程技术网

C++ TCP推拉式套接字服务器设计

C++ TCP推拉式套接字服务器设计,c++,sockets,tcp,C++,Sockets,Tcp,我正在设计一个跨平台的消息服务作为学习练习。我以前编写过基于套接字的服务器程序,但总是采用“客户机-服务器”设计,就像web服务器一样。我希望能够以移动平台为目标,并且我了解到轮询是电池消耗,所以我想做推送通知 服务器将是基于TCP的,用C++编写。我现在很难理解的是如何管理设计的双向性。我需要一个客户端能够发送数据包到服务器作为正常,但也监听数据包。我如何缓解这样的情况:当服务器试图向客户端发送数据时,客户端正在发送数据,或者在侦听数据时被阻止,但随后需要发送一些东西 例如,考虑下面的粗略图表

我正在设计一个跨平台的消息服务作为学习练习。我以前编写过基于套接字的服务器程序,但总是采用“客户机-服务器”设计,就像web服务器一样。我希望能够以移动平台为目标,并且我了解到轮询是电池消耗,所以我想做推送通知

服务器将是基于TCP的,用C++编写。我现在很难理解的是如何管理设计的双向性。我需要一个客户端能够发送数据包到服务器作为正常,但也监听数据包。我如何缓解这样的情况:当服务器试图向客户端发送数据时,客户端正在发送数据,或者在侦听数据时被阻止,但随后需要发送一些东西

例如,考虑下面的粗略图表:

所以,假设客户端A正在发送一块数据(箭头1)。发生这种情况时,客户端B发送一条消息(箭头2),这会导致服务器尝试将数据发送回客户端a(箭头3),但客户端a尚未完成箭头1的发送。在这种情况下会发生什么?我是否应该在每个客户端上设置两个单独的端口,一个用于入站,一个用于出站?我需要跟踪每个连接的状态吗


或者有更好的方法来解决这个问题吗?

一个套接字端口本身就是双向的。要或多或少同时处理入站和出站流量,您需要使用非阻塞套接字

一个套接字端口本质上是双向的。要或多或少同时处理入站和出站流量,您需要使用非阻塞套接字

一个套接字端口本质上是双向的。要或多或少同时处理入站和出站流量,您需要使用非阻塞套接字

一个套接字端口本质上是双向的。要或多或少同时处理入站和出站流量,您需要使用非阻塞套接字

我认为解决办法很简单。TCP服务器应该有一个已连接客户端的列表。由于TCP连接是双向的,所以推送机制非常简单


另一件重要的事情是,只要您的服务器不是多线程的,您就可以同时读取或写入一个客户机

我认为解决办法很简单。TCP服务器应该有一个已连接客户端的列表。由于TCP连接是双向的,所以推送机制非常简单


另一件重要的事情是,只要您的服务器不是多线程的,您就可以同时读取或写入一个客户机

我认为解决办法很简单。TCP服务器应该有一个已连接客户端的列表。由于TCP连接是双向的,所以推送机制非常简单


另一件重要的事情是,只要您的服务器不是多线程的,您就可以同时读取或写入一个客户机

我认为解决办法很简单。TCP服务器应该有一个已连接客户端的列表。由于TCP连接是双向的,所以推送机制非常简单



另一件重要的事情是,只要您的服务器不是多线程的,您就可以同时读取或写入一个客户机

tcp连接是双向的。一旦建立了服务器和服务器B的连接,两个连接的任何一端都可以向另一端发送数据包。更重要的决定是如何构造/格式化数据,以便识别每个数据包的含义。不要使用术语“数据包”(网络层事物)来指代应用层消息。这只会造成混乱。@MarcB我知道您可以通过TCP连接发送和接收数据,但您可以同时发送和接收数据吗?是的,您可以同时发送和接收数据。TCP连接是双向的。一旦建立了服务器和服务器B的连接,两个连接的任何一端都可以向另一端发送数据包。更重要的决定是如何构造/格式化数据,以便识别每个数据包的含义。不要使用术语“数据包”(网络层事物)来指代应用层消息。这只会造成混乱。@MarcB我知道您可以通过TCP连接发送和接收数据,但您可以同时发送和接收数据吗?是的,您可以同时发送和接收数据。TCP连接是双向的。一旦建立了服务器和服务器B的连接,两个连接的任何一端都可以向另一端发送数据包。更重要的决定是如何构造/格式化数据,以便识别每个数据包的含义。不要使用术语“数据包”(网络层事物)来指代应用层消息。这只会造成混乱。@MarcB我知道您可以通过TCP连接发送和接收数据,但您可以同时发送和接收数据吗?是的,您可以同时发送和接收数据。TCP连接是双向的。一旦建立了服务器和服务器B的连接,两个连接的任何一端都可以向另一端发送数据包。更重要的决定是如何构造/格式化数据,以便识别每个数据包的含义。不要使用术语“数据包”(网络层事物)来指代应用层消息。这只会造成混乱。@MarcB我知道你可以在TCP连接上发送和接收数据,但你可以同时发送和接收数据吗?是的,你可以同时发送和接收数据。@Alnitak你不是说“或”,你是说“和”。使用select on阻塞套接字会导致各种问题。(选择命中并不能保证将来的操作不会被阻止。怎么可能呢?@Alnitak谢谢,修复了它。如果你删除了你的评论,我会删除这个。因此,只要我不阻止,例如在阻止接收中,他们可以同时读/写数据,我想得太多了?@Alnitak你不是指“或”,你是指“和”。使用select on阻塞套接字会导致各种问题。(选择命中并不能保证将来的操作不会被阻止。怎么可能呢?@Alnitak谢谢,修复了它。如果你删除你的com