2012-09-18 119 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