2012-09-18 120 views
0

我有一个可以处理多个客户端一个简单的Python服务器:恢复TCP连接

import select 
import socket 
import sys 

host = '' 
port = 50000 
backlog = 5 
size = 1024 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind((host,port)) 
server.listen(backlog) 
input = [server,sys.stdin] 
running = 1 
while running: 
    inputready,outputready,exceptready = select.select(input,[],[]) 

    for s in inputready: 

     if s == server: 
      # handle the server socket 
      client, address = server.accept() 
      input.append(client) 

     elif s == sys.stdin: 
      # handle standard input 
      junk = sys.stdin.readline() 
      running = 0 

     else: 
      # handle all other sockets 
      data = s.recv(size) 
      if data: 
       s.send(data) 
      else: 
       s.close() 
       input.remove(s) 
server.close() 

一个客户端连接到它,他们可以沟通。我有第三个信箱从我发送RST信号到服务器(使用Scapy)。 TCP状态图并未说明端点是否应该在发现RESET时尝试恢复连接。有什么办法可以强制服务器恢复连接吗? (我希望它发送一个SYN,以便它连接到第三个客户端)

回答

2

您的问题没有多大意义。 TCP不能这样工作。

  1. 重新“如果一个端点应该尝试恢复时,看到一个RESET连接的TCP状态图不说”:RFC 793 #3.4明确地说:“如果接收机在任何其他国家[比LISTEN或SYN-RECEIVED],它会中止连接并建议用户进入CLOSED状态。“

  2. RST不会干扰连接,除非它通过该连接到达。我想你可以合理地伪造一个,但是你必须知道当前的TCP序列号,并且你不能从任何一个同伴那里得到它,更不用说第三个主机。

  3. 如果你成功了不知何故,该连接将被死,成品,过时了。无法看到这一点。

  4. 我不能附加任何意义到您的要求服务器发送一个SYN到第三个主机,作为对来自第三个主机的RST的响应,它已经显示为好像它来自第二个主办。 TCP也不能像这样工作。

  5. 如果您希望服务器连接到第三主机将只需要调用connect()像其他人一样。在这种情况下,它当然会成为客户。

+0

我觉得OP结下了有效的RST(他提到Scapy的),但是,是什么他要求的是不明确的。 – jman

+0

@skjaidev OP的锻造有效RST的机会是1^2^32。 – EJP