2016-11-28 20 views
0

嗨我有多个系统通过使用TCP连接的消息进行通信。即使在执行sendall后,TCP套接字也无法发送数据()

在通信两者之间的方法,我在第一发送的消息如“开始处理”,为此在返回它应回复“进程启动”

然而,消息“进程启动”不会收到其他系统,而sendall(“Process已启动”)行没有任何例外。

我的样本代码如下:

TCP初始化:

def __init__(self): 
    self.tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    self.tcp.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, struct.pack('ll',0,1)) 
    self.tcp.bind('',12000) 
    self.tcp.listen(1) 
    self.client, seld.address = self.tcp.accept() 
    (self.Ip,self.port)= self.address 

主要功能可按:

while True: 
    msg ="" 
    try: 
     msg = self.client.recv(512) 
    except socket.error as e: 
     if e[0] == 11: 
      # exception for RECVTIMEO used in the socket creation. 
      pass 
    if (msg == "Start Process"): 
      send = "Process Started" 
      self.client.sendall(send) 
      print "status sent" 

在执行这个代码段,我能够收到消息“启动过程“。但是在执行self.client.sendall(发送)的时候,虽然没有发送“进程已启动”,但是我已经捕获了wireshark中的数据包,但我得到了包含“启动进程”的数据包,但没有为“进程启动”获取数据包

有人可以帮助我吗?

回答

0

你的代码中有几个问题,但如果你通过telnet连接到端口12000和发送“启动进程”并回车,你会真正发送和接收启动过程的\ n,而不是你与现在挣扎的一个是启动过程和您的if语句不匹配。如果你去掉尾随的换行符,你可以减轻这个:

try: 
    msg = self.client.recv(512) 
    msg = msg.strip() 

虽然你的程序可能需要一些调整。当你设置你的套接字非阻塞时,self.tcp.accept()会在你尝试接受还没有的连接时引发异常。在收到正确的消息后,self.client.recv()也是一样。当你添加strip时,你的if子句将匹配,你将得到一个响应。但是,它会一直保持响应,因为它立即尝试再次recv(512),发生异常失败,然后再捕获它并再次执行if子句。 msg仍然是“启动过程”,因为它没有改变(连续的recv失败,它没有返回“”或None)。

尝试移动你的if语句在你的try/except结构中,并且只比较msg,如果你确实收到了。

这个程序也是非常浪费的,因为它会在大多数时间在繁忙的循环中运行,等待连接或消息。如果你需要使用非阻塞套接字,你需要解决这个问题。

一个更好的方法可能是使用线程有一个阻塞线程来侦听和接受新的连接,并为每个连接产生一个工作线程。这些线程可能会在recv()中被阻塞,直到收到一条消息。

只是一个想法。

Hannu

+0

已更新上述代码,我将msg重置为循环中的NULL。我没有在我的其他程序中包含这个问题,该程序稍后将“启动过程”发送给此程序,此程序仅等待其他程序启动,并通过TCP进行绑定,并且当它收到“启动过程”它应该发送“进程启动”,但它不这样做。 –

+0

我确实使用过时间。在recv()和sendall之间睡觉,那么它正在工作,但我无法理解这种行为的原因 –

+0

...你得到“状态发送”打印输出,确认sendall()被执行了? – Hannu

相关问题