"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

Reply via email to