"Chris Angelico" <ros...@gmail.com> wrote in message
news:mailman.332.1441910212.8327.python-l...@python.org...
On Fri, Sep 11, 2015 at 4:24 AM, James Harris
<james.harri...@gmail.com> wrote:
I have a listening socket, self.lsock, which is used in an accept()
call as
follows
endpoint = self.lsock.accept()
The problem is that if control-C is pressed it is not recognised
until
something connects to that socket. Only when the accept() call
returns is
the signal seen.
The question, then, is how to get the signal to break out of the
accept()
call. This is currently on Windows but I would like it to run on Unix
too. I
see from the web that this type of thing is a common problem with the
underlying C libraries but I cannot quite relate the posts I have
found to
Python.
What version of Python are you using? Also (in case it matters), what
version of Windows?
Good point. It turns out that it does matter. I have one implementation
which fails (Windows) and one which works (Linux). The Linux one breaks
out on Control-C. The Windows one does not recognise Control-C until the
accept() call returns.
The implementations are:
$ uname -srm
Linux 3.18.7-v7+ armv7l
$ python -V
Python 2.7.3
And
c:\>ver
Microsoft Windows XP [Version 5.1.2600]
c:\>python -V
Python 2.7.9
Have you tested on any Unix system? I just tried on my Linux, and
Ctrl-C interrupted the accept() straight away,
Thanks.
so this is quite probably a Windows-only issue.
That turns out to be exactly right.
Can you produce an absolute minimal demo program? I'd try something
like this:
import socket
s = socket.socket()
s.listen(1)
s.accept()
Yes:
port = 8880
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", port))
s.listen(1)
endpoint = s.accept()
which is what worked for me (interactively, Python 2.7.9 and 3.6.0a0,
Debian Linux).
On Linux I get
$ python socktest.py
^CTraceback (most recent call last):
File "socktest.py", line 6, in <module>
endpoint = s.accept()
File "/usr/lib/python2.7/socket.py", line 202, in accept
sock, addr = self._sock.accept()
KeyboardInterrupt
$
On Windows I get
S:\>python socktest.py
Traceback (most recent call last):
File "socktest.py", line 6, in <module>
endpoint = s.accept()
File "C:\Python27\lib\socket.py", line 202, in accept
sock, addr = self._sock.accept()
KeyboardInterrupt
S:\>
However, on Windows the recognition of Control-C does not happen until
after something connects to the socket.
I will carry on researching it but maybe the above gives a clue to those
in the know...!
James
--
https://mail.python.org/mailman/listinfo/python-list