Uncatchable socket.error in socket.py (?)

R

Rune

Hi,
I've written a very simple 'kill-server' to help me shut down
processes through Telnet or HTTP. The kill-server is a function and is
launched as a thread. I use the module socket.py on Python v2.3
(Windows)

I can use telnet host:port and enter the secret killword or
use a broser with http://host:port/secret_killword

The 'kill-server' validates the secret_killword and writes a file
to /tmp. The main process regularly checks for the existence of that
file, and ends the loop if it does exist.

It works well.

But most for the fun (because this will probably never be
exposed to the net, i think), I started to implement
som basic security.
For instance: I don't want ther server to be easily crashable.

So I've written some try/except blocks to handle irregularities,
but when trying to overflow the receive buffer, I get an exception
in the socket module itself

It says:
|---------------------->
Unhandled exception in thread started by <function spawn_killserver at
0x00B5EEB0>
Traceback (most recent call last):
File "X:\tmp\webcam.py", line 68, in spawn_killserver
connection.send("Nice try mister.")
File "G:\dev\python\lib\socket.py", line 143, in _dummy
raise error(EBADF, 'Bad file descriptor')
socket.error: (9, 'Bad file descriptor')
<----------------------|


Relevant code:
#init SOCKET
sock = socket(AF_INET, SOCK_STREAM)
sock.bind((host, killserver_port))
sock.listen(5)
(blah blah)

connection, address = sock.accept()

try:
buffer = connection.recv(16)
except:
connection.send("Nice try mister.")
connection.close()

So if I use a browser with this in the address field:

http://host:port/500_chars_long_string

I get the execption 'socket.error:'

But if I try to catch it with 'except socket.error:',
I generate a new exception:

AttributeError - _socketobject' has no attribute 'error'

I know I can make the receive buffer bigger, but the point
is to lock that door once and for all.

It seems to me that what happens is that the server crashes,
and that connection.send() no longer have any place to send to.

Now, enough words: What I wonder is: Can I catch that socket.error?

--rune
 
I

Irmen de Jong

Rune said:
Now, enough words: What I wonder is: Can I catch that socket.error?

By not doing

from socket import *

but rather

import socket

(and prefixing your code with "socket." where it's needed).

The socket.error you tried to catch is coming from the socket
object that you placed in your namespace by doing the "from"
import. And the socket class doesn't have an "error" attribute ;)

--Irmen
 
R

Rune

Irmen said:
By not doing

from socket import *

but rather

import socket

(and prefixing your code with "socket." where it's needed).

The socket.error you tried to catch is coming from the socket
object that you placed in your namespace by doing the "from"
import. And the socket class doesn't have an "error" attribute ;)

Thanks Irmen, but the problem seems to be that the server is actually
crashed before I can catch the exception. There is no connection to
send output to. I have no idea how to avoid this.

Rune
 
E

Erik Max Francis

Rune said:
Thanks Irmen, but the problem seems to be that the server is actually
crashed before I can catch the exception. There is no connection to
send output to. I have no idea how to avoid this.

If you catch the error, then the server won't have "crashed," and you'll
be able to recover however you like.
 
R

Rune

Erik said:
If you catch the error, then the server won't have "crashed," and you'll
be able to recover however you like.

I am able to catch the exception, but thie connection object from
connection, address = sockobj.accept(), is lost.

I cannot connect to the server any longer and connection.send(data)
will generate a new socket.error: (9, 'Bad file descriptor')

I can't find a way out of this but to restart the server.

R
 
E

Erik Max Francis

Rune said:
I cannot connect to the server any longer and connection.send(data)
will generate a new socket.error: (9, 'Bad file descriptor')

I see; it wasn't entirely clear to me what your complaint was from your
first message. If you're getting an exception when calling recv, the
connection has already dropped. You can't send the message because the
connection isn't there anymore. Catching or not catching an exception
won't change that.
 
R

Raymond Hettinger

I cannot connect to the server any longer and connection.send(data)
I see; it wasn't entirely clear to me what your complaint was from your
first message. If you're getting an exception when calling recv, the
connection has already dropped. You can't send the message because the
connection isn't there anymore. Catching or not catching an exception
won't change that.

Guido handles this situation using timemachine exceptions:

try:
communicationcode()
unrecoverable_except socket.error:
alternatecode()

This works as expected. If the communciation code raises an
unrecoverable exception, then time is backed up to just before
the communication code was executed and the alternate code
is run instead.

I believe he intends to incorporate this feature in his next
language, Voyager, which is named after a Star Trek spin-off.
The idea is not really new; it is just an extension of commit/rollback
for socketlike objects where the state (uncrashed) is not easily
restored without access to timemachine hardware.


Raymond Hettinger
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,821
Latest member
AleidaSchi

Latest Threads

Top