簡體   English   中英

Python SocketServer.TCPServer錯誤號10054

[英]Python SocketServer.TCPServer errno 10054

我正在使用python 2.7中的socketserver模塊運行python服務器。 OmniPeek數據包分析工具顯示TCP握手已完成,但是服務器會立即發送重置數據包以終止連接。

顯示問題的簡化服務器代碼為:

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

服務器代碼基於python 2.7 docs serversocket Mixin示例,並且看起來非常簡單,但是...

謝謝

不確定您的預期行為是什么,但是如果您進行了一些更改,您將能夠看到它可以正常工作

替換您的句柄方法

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..."

和客戶(在main內部):

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']。acquire()和release()調用存在問題。 我取出了“運行中”檢查,因為除了服務器代碼的末尾,它並沒有真正使用過。 另外,如果不采取任何措施,套接字將超時。

再一次,我不是聲稱自己已經解決了問題……而且我不確定您到底在尋找什么……只是在幫助您集思廣益!

抱歉-紅鯡魚。 僅當服務器在來賓下運行而客戶端在主機下運行時,才在VM下發生此問題。 當客戶端和服務器都在主機或訪客上運行時,TCP重置數據包從不發送

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM