Python SocketServer.TCPServer errno 10054

时间:2014-09-30 22:33:15

标签: python sockets python-2.7

我在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示例,看起来非常简单,但是......

由于

2 个答案:

答案 0 :(得分:0)

不确定您的预期行为是什么,但如果您进行了一些更改,您将能够看到它可以正常工作

替换你的句柄方法

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']。acquire()和release()调用存在问题。我拿出了'运行'检查,因为除了在服务器代码的末尾,它没有被真正使用。 此外,没有任何操作,套接字将超时。

再一次,我并没有声称“修复”了你的问题......而且我不确定你到底在寻找什么...只是帮助你进行头脑风暴!

答案 1 :(得分:0)

道歉 - 红鲱鱼。当服务器在guest虚拟机下运行且客户端在主机下运行时,问题仅发生在VM下。当客户端和服务器在主机或来宾上运行时,TCP重置数据包永远不会发送