即使在执行sendall()后TCP Socket也无法发送数据

时间:2016-11-28 12:59:17

标签: python c++ sockets tcp wireshark

您好我有多个系统使用TCP连接通过消息进行通信。

在两者之间的沟通过程中,我首先发送一条消息“开始流程”,作为回报,它应该回复为“流程已开始”

但是,没有收到其他系统的“Process Started”消息,而sendall(“Process Started”)行没有任何例外。

我的示例代码如下:

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"

执行这段代码时,我能够收到消息“Start Process”。但是在执行self.client.sendall(send)行时没有发送“Process started”,我已经在wireshark中捕获了数据包,我收到了包含“Start Process”的数据包,但没有为“Process Started”获取数据包

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题,但您现在正在努力解决的问题是,如果您使用telnet连接到端口12000并发送“Start Process”并按Enter键,您实际上将发送和接收Start Process \ n而不是Start进程和你的if语句不匹配。如果您删除尾随换行符,则可以缓解此问题:

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

但是你的程序可能需要一些调整。当您设置套接字非阻塞时,self.tcp.accept()会在您尝试接受尚未存在的连接时引发异常。收到正确的消息后,self.client.recv()也是如此。添加strip时,if子句将匹配,您将得到响应。但是,它会继续响应,因为它会立即再次尝试recv(512),失败并出现异常,然后你抓住它并再次执行if子句。 msg仍然是“Start Process”,因为它没有改变(连续的recv刚刚失败,它没有返回“”或None)。

尝试在try / except结构中移动if子句,并仅在实际收到msg时比较msg。

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

更好的方法可能是使用线程来拥有一个监听和接受新连接的阻塞线程,并且对于每个连接,它都会产生一个工作线程。然后,这些线程可以在recv()中阻塞,直到收到消息。

只是一个想法。

哈努哈利