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

AltStyle によって変換されたページ (->オリジナル) /