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
我有一个哑网络服务,它接收整个文件直至 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