与内存中的_socketobject地址做出反应

时间:2017-11-30 20:26:15

标签: python sockets

我正在尝试从内存地址“socket._socketobject对象0x7f4c39d78b40”访问套接字对象,并在不同时间将其用于另一个函数。客户端连接到端口9999,我希望服务器在稍后阶段对每个客户端做出反应,同时保持连接。

def sock_con(host,port):
    host = host
    port = port
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((host, port))
    sock.listen(5)
    while True:
        client, address = sock.accept()
        print client
        print type(client)
        print "Server (%s, %s) connected" % address
        mongoconn = connectionx('IP_Clients')
        key = {'addresses':'192.168.11.1'}
        data = {'client':str(client), 'addresses':address}
        mongoconn.update(key, data)
        client.settimeout(60)

下一个代码位于不同的模块,可以随时使用:

import os,sys
import socket
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)
from mgodb import connectionx
mongoconn = connectionx('IP_Clients')
x= mongoconn.find_one({'addresses':'192.168.11.1'})
client= eval(x['client'])


def send_stuff(client,addresses,arg1):
    while True:
        try:
            #data = client.recv(size)
            print data
            client.send(arg1)
            return data

        except:
            #raise error('Client disconnected')
            client.close()
            return False



send_stuff(client,x['addresses'],'test10')

1 个答案:

答案 0 :(得分:0)

要在稍后的同一个过程中使用套接字,只需将它们存储在到达时间,然后再找到它们。像这样:

...
clients = {}
while True:
    client, addr = server.accept()
    clients[addr[0]] = client

因此,如果您停止监听循环,或在线程中运行它,或者在线程中运行其他东西(无关紧要),您可以通过客户端的IP地址从字典客户端获取打开的套接字对象。

client = clients.get("192.168.1.1")

但是您也应该在端口中进行检测,因为可能有两个不同的客户端通过相同的IP地址与您联系。

如果你想将一个打开的套接字发送到另一个进程,那么它是可行的,但不值得麻烦。 您需要将套接字的filedescriptor(socket.fileno())发送到另一个进程,这可以使用Python模块sendfds完成。它可以在pypi.python.org上找到。 然后,在接收过程中,您必须手动构造套接字包装器对象,或者以某种方式欺骗现有的_socket.dll / .so和socket.py模块来为您完成。 很多工作和成功都很可疑。你应该做的是使用字典来存储套接字并创建一个接口(通过套接字,PIPE或任何IPC)来向所需的连接套接字转发消息。

最后,你根本不必担心这个混乱,因为Python有asyncore模块。 它已经将套接字存储到字典和其他有用的东西中。问题是,你需要知道你想要实现什么才能充分调整asyncore客户端处理程序。设置正确的缓冲区大小等。但asyncore很优雅,您可以轻松地将它与现有的GUI事件循环混合。在创建推送服务器或类似即时消息的系统时经常使用asyncore和asynchat。