Socket连接到基于Telnet的服务器时读取挂起

5 投票
2 回答
7985 浏览
提问于 2025-04-15 23:03

我正在用Python写一个简单的基于socket的客户端,目的是连接到一个telnet服务器。我可以通过telnet连接到它的端口(5007),然后输入文本。服务器会回复一个NAK(错误)或者AK(成功),有时还会附带其他文本。听起来很简单。

我写了一个客户端来连接并与服务器通信,但在第一次尝试读取响应时,它就卡住了。连接是成功的。像getsockname和getpeername这样的查询也都成功了。send命令返回的值等于我发送的字符数,所以看起来发送是正确的。但最终,当我尝试读取响应时,它总是卡住。

我尝试过使用基于文件的对象,比如readline和write(通过socket.makefile),也尝试过使用send和recv。用文件对象时,我试着用“rw”模式来读写,后来又尝试用一个对象“r”来读取,另一个“w”来写,以便分开它们。但这些都没有成功。

我用一个数据包嗅探器来观察发生了什么。我对看到的内容不是很熟悉,但在telnet会话中,我可以看到我输入的文本和服务器返回的文本。在我的Python socket连接中,我可以看到我的文本发送到了服务器,但返回的数据包似乎没有任何文本。

有没有什么想法我做错了,或者有什么策略可以尝试?

这是我使用的代码(在这个例子中,是用send和recv):

#!/usr/bin/python

host = "localhost"
port = 5007
msg = "HELLO EMC 1 1"
msg2 = "HELLO"

import socket
import sys

try:
    skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
    print("Error creating socket: %s" % e)
    sys.exit(1)

try:
    skt.connect((host,port))
except socket.gaierror, e:
    print("Address-related error connecting to server: %s" % e)
    sys.exit(1)
except socket.error, e:
    print("Error connecting to socket: %s" % e)
    sys.exit(1)

try:
    print(skt.send(msg))
    print("SEND: %s" % msg)
except socket.error, e:
    print("Error sending data: %s" % e)
    sys.exit(1)


while 1:
    try:
        buf = skt.recv(1024)
        print("RECV: %s" % buf)
    except socket.error, e:
        print("Error receiving data: %s" % e)
        sys.exit(1)
    if not len(buf):
        break
    sys.stdout.write(buf)

哦,如果有用的话,这里有一个手动进行的telnet会话示例:

ubuntu:~/mac/python$ telnet localhost 5007
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HELLO EMC 1 1
HELLO ACK EMCNETSVR 1.1

第一行'HELLO'是我输入的,第二行是服务器的响应。

2 个回答

0

你需要在send之后立刻flush这个套接字,这样才能强制TCP协议把数据发送出去。否则,它会等着更多的数据来填满一个数据包。这样一来,当你在等待服务器的回复时,其实什么数据都还没发送出去。

7

你可能需要在你的 msg 后面加上一些“换行符”——可能是 \r\n,也可能只是其中一个。当你在使用telnet的时候,是不是按下回车键来结束你输入的内容?在你的Python代码里,你没有做这个操作。

撰写回答