繁体   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