与基于telnet的服务器的套接字连接在读取时挂起

时间:2010-05-23 21:35:42

标签: python sockets

我正在尝试在Python中编写一个基于套接字的简单客户端,它将连接到telnet服务器。我可以通过telnet到它的端口(5007)测试服务器,然后输入文本。它以NAK(错误)或AK(成功)响应,有时伴随其他文本。似乎很简单。

我编写了一个连接服务器并与服务器通信的客户端,但它是第一次尝试读取响应时挂起的。连接成功。像getsockname和getpeername这样的查询是成功的。 send命令返回一个等于我发送的字符数的值,因此它似乎正在正确发送。但最后,当我尝试阅读回复时,它总是挂起。

我尝试过使用基于文件的对象,如readline和write(通过socket.makefile),以及使用send和recv。使用文件对象,我尝试使用“rw”并通过该对象进行读取和写入,然后尝试将一个对象用于“r”,另一个用于“w”以将它们分开。这些都不起作用。

我使用数据包嗅探器来观察正在发生的事情。我并不精通我所看到的一切,但在telnet会话期间,我可以看到我输入的文本和服务器的文本。在我的Python套接字连接期间,我可以看到我的文本发送到服务器,但是回来的数据包似乎没有任何文本。

关于我做错了什么或任何策略尝试的任何想法?

这是我正在使用的代码(在这种情况下,它是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 :(得分:7)

您可能需要使用某种“行尾字符”终止您的msg - 也许\r\n,也许只是其中之一。当你在telnet时,是不是通过点击Return或Enter键来终止输入的文本?在Python代码中,你没有做到相同的。

答案 1 :(得分:0)

您需要在flush之后send套接字,以强制TCP堆栈实际发送数据。否则它将等待更多数据发送,以便有效地填充数据包。当您在等待服务器的响应时,实际上还没有发送任何内容。