socat 相当于 netcat -N

socat equivalent of netcat -N

我有一个哑网络服务,它接收整个文件直至 EOF,然后发出响应。

我可以这样使用它:

netcat -N $SERVER $PORT < input > output

netcat 的 -N 选项导致在读取文件时发送 shutdown(..., SHUT_WR),以便服务器处理并发送输出。

我找不到等效的 socat。

类似于:

socat - TCP:$SERVER:$PORT,linger=5000,shut-down < input > output

但我始终无法获取响应数据。

这是一个小型 python 服务器,经过讨论,它最低限度地模仿了您描述的服务器。

import asyncio
import time

class FileReceiver(asyncio.Protocol):

    def connection_made(self, transport):
        print("connection_made")
        self.transport = transport

    def data_received(self, data):
        print(data)

    def eof_received(self):
        time.sleep(2)
        self.transport.write("hello\n".encode());
        if self.transport.can_write_eof():
            self.transport.write_eof()
        return True    

async def main(host, port):
    loop = asyncio.get_event_loop()
    server = await loop.create_server(FileReceiver, host, port)
    await server.serve_forever()

asyncio.run(main('127.0.0.1', 5000))

它正确地 returns hello\n 和

netcat -N $SERVER $PORT < input > output

不 return hello\n 当 -N 被删除时

netcat $SERVER $PORT < input > output

但不适用于

socat - TCP:$SERVER:$PORT < input > output

socat 默认发送 SHUT_WR 所以不需要关闭,netcat -N 和 socat 的关闭是一样的。问题出在时机上。如果 time.sleep 被排除,socat 会工作,因此 socat 关闭得太快。 socat 关闭通道的默认延迟是 0.5 秒。这可以用 -t 选项扩展。以下工作正常。

socat -t 5 - TCP:$SERVER:$PORT < input > output