homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author giampaolo.rodola
Recipients
Date 2007年06月12日.21:13:39
SpamBayes Score
Marked as misclassified
Message-id
In-reply-to
Content
client
======
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 21))
s.send("sumthin")
server
======
import asyncore, asynchat
import socket
import time
class Handler(asynchat.async_chat):
 def __init__(self, server, sock, addr):
 asynchat.async_chat.__init__(self, sock)
 self.set_terminator("\n") 
 self.data = ""
 self.respond("Hey there!\r\n")
 def respond(self, data):
 print "->" + data
 time.sleep(1)
 self.push(data)
 def collect_incoming_data(self, data):
 print "<-" + data
 self.data = self.data + data
 def found_terminator(self):
 self.respond(self.data)
 self.data = ''
 def handle_close(self):
 remote_ip, remote_port = self.socket.getpeername()
 print "%s:%s disconnected" %(remote_ip, remote_port)
 self.close()
 def handle_error(self):
 raise
 
class Server(asyncore.dispatcher):
 def __init__(self, address):
 asyncore.dispatcher.__init__(self)
 self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
 self.bind(address)
 self.listen(5)
 def handle_accept(self):
 conn, addr = self.accept()
 Handler(self, conn, addr)
address = ('', 21)
Server(address)
print "server ready."
asyncore.loop()
proposed patch
==============
--- line 55
- from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, \
- ENOTCONN, ESHUTDOWN, EINTR, EISCONN, errorcode
+ from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, \
+ ENOTCONN, ESHUTDOWN, EINTR, EISCONN, ECONNABORTED, errorcode
--- line 329
 def send(self, data):
 try:
 result = self.socket.send(data)
 return result
 except socket.error, why:
 if why[0] == EWOULDBLOCK:
 return 0
+ elif why[0] == ECONNABORTED:
+ self.handle_close()
+ return 0
 else:
 raise
 return 0
--- line 340
 def recv(self, buffer_size):
 try:
 data = self.socket.recv(buffer_size)
 if not data:
 # a closed connection is indicated by signaling
 # a read condition, and having recv() return 0.
 self.handle_close()
 return ''
 else:
 return data
 except socket.error, why:
 # winsock sometimes throws ENOTCONN
- if why[0] in [ECONNRESET, ENOTCONN, ESHUTDOWN]:
+ if why[0] in [ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED]:
 self.handle_close()
 return ''
 else:
 raise
History
Date User Action Args
2007年08月23日 15:58:44adminlinkissue1736101 messages
2007年08月23日 15:58:44admincreate

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