2014-09-30 59 views
0

我在python 2.7中運行一個使用socketserver模塊的python服務器。 OmniPeek數據包分析工具顯示TCP握手完成, 但服務器立即發送一個重置數據包來查看連接。Python SocketServer.TCPServer errno 10054

簡化服務器代碼表示的問題是:

from threading import Lock, Thread, Condition 
import SocketServer 
import socket 
import sys 
import time 


class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): 

    def __init__(self, state, *args, **keys): 

     try: 
      state['lock'].acquire() 
      state['client_count'] += 1 
     finally: 
      state['lock'].release() 

     self.state = state 
     SocketServer.BaseRequestHandler.__init__(self, *args, **keys) 

    def handle(self): 
     self.state['lock'].acquire() 
     count = self.state['client_count'] 
     self.state['lock'].release() 

     while True: 
      try: 
       self.state['lock'].acquire() 
       running = self.state['running'] 
       self.state['lock'].release() 
       if not running: 
        break; 

       time.sleep(1) # do some work 

      except Exception as msg: 
       print msg 

     print "ThreadedTCPRequestHandler shutting down..." 


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 


def handler_factory(state): 
    def createHandler(*args, **keys): 
     return ThreadedTCPRequestHandler(state, *args, **keys) 
    return createHandler 

if __name__ == "__main__": 
    lock = Lock() 
    cv = Condition(lock) 
    state = {'running': True, 'client_count': 0, 'lock': lock, 'cv': cv} 

    server = ThreadedTCPServer(('localhost', 12345), handler_factory(state)) 
    server_thread = Thread(target=server.serve_forever) 
    server_thread.daemon = True 
    server_thread.start() 
    print "Server loop running in thread:", server_thread.name 

    # wait for a client to connect 
    cv.acquire() 
    while state['client_count'] == 0 and state['running']: 
     cv.wait(1.0) 
     # print msg 
    cv.release() 

    # substitute real work here... 
    time.sleep(5) 

    lock.acquire() 
    state['running'] = False 
    lock.release() 
    server.shutdown() 

和客戶端的代碼:

import socket 

if __name__ == "__main__": 
    try: 
     client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     print 'ip: {} port {}'.format('10.4.2.54', 12345) 
     client.connect(('10.4.2.54', 12345)) 

     while True: 
      data = client.recv(4096) 
      if len(data) == 0: 
       break; 

      print 'data: {}'.format(data) 

     client.shutdown(socket.SHUT_RDWR) 
     client.close() 
    except Exception as msg: 
     print msg 

服務器代碼是基於關閉蟒2.7文檔的ServerSocket密新實例,並且似乎非常簡單,但...

謝謝

回答

0

道歉 - 紅鯡魚。當服務器在guest虛擬機下運行並且客戶機在主機下運行時,問題只發生在虛擬機下。當客戶端和服務器都在主機或客戶端上運行時,TCP重置數據包從未發送

0

不知道你是什麼[R預期的行爲是,但如果你做一些修改,你就可以看到,它可以工作

取代你的手柄方法

def handle(self): 
    while True: 
     try: 
      data = self.request.recv(1024).strip() 
      if len(data) != 0: 
       print data 

      time.sleep(1) # do some work 
      self.request.send('test data') 
     except Exception as msg: 
      print msg 
      break 

    print "ThreadedTCPRequestHandler shutting down..." 

和客戶(內部主):

try: 
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    print 'ip: {} port {}'.format('localhost', 1232) 
    client.connect(('localhost', 1232)) 
    client.send('test') 
    n = 0 
    while True: 
     data = client.recv(4096) 
     if len(data) != 0: 
      print 'data: {}'.format(data) 

     time.sleep(1) 
     n += 1 
     client.send('keep-alive' + str(n) + '\n') 
     print 'here' 

    client.shutdown(socket.SHUT_RDWR) 
    client.close() 
except Exception as msg: 
    print msg 

我只是改裝它發送東西和打印的東西。但它不會崩潰。 我認爲你的self.state ['lock'] .success()和release()調用有問題。我拿出'運行'檢查,因爲它除了在服務器代碼的末尾之外並沒有真正使用。 另外,沒有任何操作,套接字將超時。

再一次,我並沒有聲稱「解決」了你的問題......我不確定你正在尋找什麼......只是幫助你集思廣益!

+0

感謝發佈。爲了簡潔起見,我在發佈前取出了所有send/recv代碼,但問題與VM有關 – user658878 2014-10-01 16:48:59

相關問題