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
Sockets Libuv-单个连接上的多个TCP请求_Sockets_Tcp_Asyncsocket_Libuv - Fatal编程技术网

Sockets Libuv-单个连接上的多个TCP请求

Sockets Libuv-单个连接上的多个TCP请求,sockets,tcp,asyncsocket,libuv,Sockets,Tcp,Asyncsocket,Libuv,使用Libuv,我实现了一个调用另一个TCP服务器B的TCP服务器a 随着服务器A不断收到请求,我使用从A到B建立的单一TCP连接向服务器B发送请求 考虑到Libuv是异步的和面向回调的,我如何区分从服务器B获得的响应?i、 e.如何将正确的结果发送回服务器A的客户端 文档说,uv\u read\u cb回调将被调用多次。我如何知道为哪个原始请求调用了uv\u read\u cb?TCP是基于流的,而不是基于消息的-您不是发送单个消息,而是发送一个无差别的数据流。所以简而言之,你要做的事情总是很

使用Libuv,我实现了一个调用另一个TCP服务器B的TCP服务器a

随着服务器A不断收到请求,我使用从A到B建立的单一TCP连接向服务器B发送请求

考虑到Libuv是异步的和面向回调的,我如何区分从服务器B获得的响应?i、 e.如何将正确的结果发送回服务器A的客户端


文档说,
uv\u read\u cb
回调将被调用多次。我如何知道为哪个原始请求调用了
uv\u read\u cb

TCP是基于流的,而不是基于消息的-您不是发送单个消息,而是发送一个无差别的数据流。所以简而言之,你要做的事情总是很棘手的,处理方法完全取决于你

您需要在TCP之上创建自己的协议。根据您的需求,这可能很简单,只需分配一个唯一的ID并随响应一起发送即可。当然,您还必须处理消息转换本身——就像处理任何基于TCP的消息协议一样。我强烈建议只使用一个线程将任何数据写入TCP流——您可以使用线程安全队列发布消息,这样它们就不会被通常的异步写入破坏


读取回调将拾取碎片和合并的消息,这是毫无疑问的。这是一个标准的TCP场景,您需要为此做好准备。这就是为什么我还建议使用单个读取器,它将从流中读取,并将每个解析的消息发布到另一个队列。您可以使用与请求一起发送的唯一ID,根据需要将其配对。

TCP之上是什么协议?没有协议中立的方法可以做到这一点。例如,多路传输HTTP请求的方式与多路传输SMTP请求的方式完全不同。