How to create a socket.socket() object from a socket fd?

Grant Edwards grant.b.edwards at gmail.com
Sat Jan 21 17:41:31 EST 2017


On 2017-01-21, Grant Edwards <grant.b.edwards at 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.

-- 
Grant








More information about the Python-list mailing list