【问题标题】:Socket connection to a telnet-based server hangs on read与基于 telnet 的服务器的套接字连接在读取时挂起
【发布时间】:2010-05-24 08:15:37
【问题描述】:

我正在尝试用 Python 编写一个简单的基于套接字的客户端,它将连接到远程登录服务器。我可以通过远程登录到其端口(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'是我输入的,第二行是响应。

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    您可能需要使用某种“行尾字符”来终止您的msg——也许是\r\n,也许只是两者之一。当您在 telnet 中时,您不是通过按 Return 或 Enter 键来终止键入的文本吗?在 Python 代码中,您并没有这样做。

    【讨论】:

    • 太棒了,\r 成功了!我之前尝试过\n(没有工作)但不知道\r。也不需要冲洗。谢谢!
    • 原来我需要\r\n,而不仅仅是\r。 \r 在某些情况下有效,但并非全部有效,这令人困惑。 \n 本身没有任何作用。
    【解决方案2】:

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

    【讨论】:

    • 我在文件对象版本上尝试了 flush(),但行为没有改变。似乎没有适用于 socket.write (?) 的 socket 的 flush() 方法。
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2014-04-12
    • 2018-07-10
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多