如何使用netcat将一个字节的符号发送到服务器套接字?

6

已经有一个通过套接字工作的服务器服务,我想通过netcat测试它。 我正在使用Mac OS X Lion。 目前,我能够通过端口连接到服务器,发送数据包,但数据包包含错误的值。以下是详细信息:

我需要向服务器发送'm'符号,服务器将返回00000000,即零字节作为响应。 服务器人员告诉我,当我发送'm'时,服务器接收到'A0',当我发送'109'时,服务器接收到'313039A'。如何定义发送格式或其他内容,我只需要发送'm'(01101101)?


不知道A0是什么,但在ASCII中109是0x31 0x30 0x39 - cnicutar
1个回答

19

您可以通过以下方式仅发送 "m":

echo -n 'm' | nc <server> <port>

你可以轻松地检查你在本地机器上发送的内容:

# in one Terminal start the listener:
$ nc -l 1234 | hexdump -C
00000000  6d                                                |m|
00000001

# in other Terminal send the packet:
$ echo -n 'm' | nc 127.0.0.1 1234

nc可以愉快地发送/接收NUL字节 - 这没有任何问题:

# sending side
$ echo -n X | tr X '\000' | nc 127.0.0.1 1234

# receiving side
$ nc -l 1234 | hexdump -C
00000000  00                                                |.|
00000001

非常感谢。然而,当我只通过nc发送“m”时,服务器没有响应。但是当我从我的程序(Objective-C)手动形成数据包时,它会响应。此外,在示例中,“00000000”和“00000001”代表什么? 我认为“6d”代表“m”,但其他值代表什么?在我看来,它发送了3个字节:空字节,“m”的值和数据包大小。 - Centurion
但我只需要发送1个字节:即“m”的值(01101101)。这就是服务器的实现方式。这是一个握手数据包。 - Centurion
不,000000是地址 - 基于0,因此它表示只有一个单独的字节0x6d,即'm'。 - Simon Urbanek
好的。实际上,在收到握手“m”后,服务器会发送零字节作为响应。也许一切都很正常,我确实向服务器发送了“m”,但是可能netcat没有显示零字节。在此操作之后,连接已建立,我可以发送其他数据包并从中看到结果,但不确定如何在进行第二个请求时输入确切的字节。在echo .. nc之后,光标位于空白新行中,我认为所有输入的符号都被解释为ASCII符号,而不是字节。 - Centurion
netcat可以愉快地接收NUL字符并将其传递 - 我已更新答案以演示输出 - Simon Urbanek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接