An asyncio example
Adam Bartoš
drekin at gmail.com
Sat Jul 4 07:07:50 EDT 2015
>
> On Fri, Jul 3, 2015 at 9:14 AM, Marko Rauhamaa <marko at pacujo.net>
> wrote:
> >
> >>> 1) is there a way to close just one direction of the connection?
> >>
> >> No. SOCK_STREAM sockets are always bidirectional.
> >
> > socket.shutdown(socket.SHUT_WR) does the trick.
> >
> > I think the asyncio.StreamWriter.write_eof() is the high-level
> > equivalent.
>
> I stand corrected. And you're also correct about write_eof: it causes
> shutdown(SHUT_WR) to be called on the underlying socket once the
> buffer has been written.
>
>
> https://hg.python.org/cpython/file/34460219c0e0/Lib/asyncio/selector_events.py#l737
>
> That said, just replacing the writer.close() with writer.write_eof()
> in the OP's code doesn't seem to work; the server response comes back
> empty.
>
> This works:
>
> >>> sock1, sock2 = socket.socketpair()
> >>> sock1.send(b'REQUEST')
> 7
> >>> sock1.shutdown(socket.SHUT_WR)
> >>> sock2.recv(100)
> b'REQUEST'
> >>> sock2.send(b'RESPONSE')
> 8
> >>> sock1.recv(100)
> b'RESPONSE'
>
> And this works:
>
> import asyncio
> import socket
>
> def server(sock):
> request = yield from asyncio.get_event_loop().sock_recv(sock, 100)
> print("got request {!r}".format(request))
> yield from asyncio.get_event_loop().sock_sendall(sock, b'RESPONSE')
>
> def client(sock):
> yield from asyncio.get_event_loop().sock_sendall(sock, b'REQUEST')
> sock.shutdown(socket.SHUT_WR)
> response = yield from asyncio.get_event_loop().sock_recv(sock, 100)
> print("got response {!r}".format(response))
> asyncio.get_event_loop().stop()
>
> def connect():
> clientsock, serversock = socket.socketpair()
> clientsock.setblocking(False)
> serversock.setblocking(False)
> asyncio.async(client(clientsock))
> asyncio.async(server(serversock))
>
> connect()
> asyncio.get_event_loop().run_forever()
>
> I'm wondering whether there might be a bug in the higher-level
> transport code that interferes with reading after calling write_eof.
There is a bug. See http://bugs.python.org/issue24539 .
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20150704/b35bcffe/attachment.html>
More information about the Python-list
mailing list