On 2017-01-21 23:41, Grant Edwards wrote: > On 2017-01-21, Grant Edwards <grant.b.edwa...@gmail.com> wrote: > >> Given a Unix file discriptor for an open TCP socket, I can't figure >> out how to create a python 2.7 socket object like those returned by >> socket.socket() >> >> Based on the docs, one might think that socket.fromfd() would do that >> (since the docs say that's what it does): > [...] >> That prompts a question: given a "socket object" as returned by >> socket.fromfd(), how does one create a "socket._socketobject object" >> as returned by socket.socket()? > > Of course I figured it out immediately after spending 15 minutes > whinging about it. > > help(socket.socket) gives you a hint: > > class _socketobject(__builtin__.object) > | socket([family[, type[, proto]]]) -> socket object > | > [...] > | > | Methods defined here: > | > | __init__(self, family=2, type=1, proto=0, _sock=None) > | > > Ah! There's a keyword argument that doesn't appear in the docs, so > let's try that... > > context = ssl.create_default_context() > [...] > sock = socket.fromfd(fd2,socket.AF_INET,socket.SOCK_STREAM) > nsock = socket.socket(socket.AF_INET,socket.SOCK_STREAM,_sock=sock) > conn = context.wrap_socket(nsock, server_hostname="whatever.invalid") > > That works.
You might be interested in my small module https://pypi.python.org/pypi/socketfromfd/ . I just releases a new version with a fix for Python 2. Thanks for the hint! :) The module correctly detects address family, socket type and proto from a fd. It works correctly with e.g. IPv6 or Unix sockets. Ticket https://bugs.python.org/issue28134 has additional background information on the matter. Christian -- https://mail.python.org/mailman/listinfo/python-list