0

我尝试使用套接字进行 2 次发送。第一个成功,下一个没有。从http://docs.python.org/howto/sockets.html 看来,应该允许多次发送。无论好坏,我真的不需要从套接字读取。我使用了 twisted,但就目前的目的而言,如果我能提供帮助,我想坚持使用套接字(部分原因是我在已经使用 twisted 进行通信的应用程序中使用它。这是一个单独的连接)。

“当连接完成后,socket s 可以用来发送请求页面的文本。同一个socket会读取回复,然后被销毁。没错,被销毁。客户端sockets通常只用于一个交换(或一小组顺序交换)。”

发送成功的返回值 = 35 发送失败的返回值 = 32

进行一些小的编辑以删除任何业务逻辑的代码。

self._commandSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)


def sendPrereqs(self,id,prereqs):
    self._commandSock.connect(self._commandConnection)
    #parse prereqs
    temp = prereqs.split(',')
    for pair in temp:
        tup = pair.partition(':')
        try:
            command = 'some command'
            logging.info('sending command: ' + command)
            ret = self._commandSock.send(command)
            if ret == None:
                logging.info('send called successfully: ' + command)
            else:
                logging.info('socket returned non-None: ' + str(ret))
        except:

            print 'Unexpected Exception ', sys.exc_info()[0]()
            print sys.exc_info()
            #logging.info('Unexpected Exception '+ str(sys.exc_info()[0]()))
            #logging.info(' ' + str(sys.exc_info()))
    self._commandSock.close()`
4

2 回答 2

2

发送成功的返回值 = 35 发送失败的返回值 = 32

文档说成功发送应该返回无。

不,它没有。文档说:

返回发送的字节数。应用程序负责检查所有数据是否已发送;如果仅传输了部分数据,则应用程序需要尝试传输剩余数据。有关此概念的更多信息,请参阅 Socket Programming HOWTO。

您还没有解释“失败”的含义。调用成功返回,send几乎可以肯定它已将 32 个字节放入套接字写入缓冲区。

如果您认为它失败的唯一原因是它返回了正确的值,那么答案显然是它没有失败。

如果其他事情出了问题,那么在更高的层次上可能会出现各种各样的事情。一个可能的情况是:服务器(特别是如果它是由不太了解套接字的人编码的)被编码为期望recv()35 字节之一recv()和 32 字节之一。但它实际上得到了一个recv()67 字节,并且永远等待第二个,而第二个永远不会到来。没有规则保证send()流 (TCP) 套接字上的每个套接字都对应recv()另一侧的一个。您需要创建某种类型的流协议来划分单独的消息。

同时,您所指的报价无关紧要。它描述了简单的 Web 浏览器如何使用客户端套接字:它们建立连接,进行一次发送,接收所有数据,然后销毁连接。我知道它为什么会误导您,您可能需要提交文档错误以对其进行改进。但现在,请忽略它。

如果您想确保客户端发送正确的数据,而问题出在服务器上,有两种简单的方法可以做到这一点:

  1. 使用netcat作为一个简单的替代服务器(例如,nc -kl 6000用实际端口替换“6000”)并确保它记录您认为服务器应该看到的内容。

  2. 使用Wireshark观察客户端和服务器之间的连接。

确认问题出在服务器端后,您需要调试服务器。如果您需要这方面的帮助,最好在一个新问题中完成,您可以在其中发布服务器代码而不是客户端,并解释(此处带有链接)您确定客户端正在发送正确的信息。

于 2012-10-03T19:49:07.730 回答
0

该文档仅指一种常见情况。您可以根据需要随时在所有套接字上调用sendsendallsendto——只要套接字未关闭。

请注意,这些方法返回发送的字节数,32 和 35 仅表示您第一次发送了 32 个字节,第二次发送了 35 个字节。

无异常返回的事实socket.send意味着数据已传递给操作系统,但并不意味着它实际上到达了端点(或已被那里的应用程序正确读取)。

于 2012-10-03T19:20:04.050 回答