mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			152 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| "Socket wrapper for Windows, which does not support dup()."
 | |
| 
 | |
| # (And hence, fromfd() and makefile() are unimplemented in C....)
 | |
| 
 | |
| # XXX Living dangerously here -- close() is implemented by deleting a
 | |
| # reference.  Thus we rely on the real _socket module to close on
 | |
| # deallocation, and also hope that nobody keeps a reference to our _sock
 | |
| # member.
 | |
| 
 | |
| 
 | |
| 
 | |
| try:
 | |
| 	from _socket import *
 | |
| except ImportError:
 | |
| 	from socket import *
 | |
| 
 | |
| _realsocketcall = socket
 | |
| 
 | |
| 
 | |
| def socket(family, type, proto=0):
 | |
| 	return _socketobject(_realsocketcall(family, type, proto))
 | |
| 
 | |
| 
 | |
| class _socketobject:
 | |
| 
 | |
| 	def __init__(self, sock):
 | |
| 		self._sock = sock
 | |
| 
 | |
| 	def close(self):
 | |
| 		self._sock = 0
 | |
| 
 | |
| 	def __del__(self):
 | |
| 		self.close()
 | |
| 
 | |
| 	def accept(self):
 | |
| 		sock, addr = self._sock.accept()
 | |
| 		return _socketobject(sock), addr
 | |
| 
 | |
| 	def dup(self):
 | |
| 		return _socketobject(self._sock)
 | |
| 
 | |
| 	def makefile(self, mode='r', bufsize=-1):
 | |
| 		return _fileobject(self._sock, mode, bufsize)
 | |
| 
 | |
| 	_s = "def %s(self, *args): return apply(self._sock.%s, args)\n\n"
 | |
| 	for _m in ('bind', 'connect', 'connect_ex', 'fileno', 'listen',
 | |
| 		   'getpeername', 'getsockname',
 | |
| 		   'getsockopt', 'setsockopt',
 | |
| 		   'recv', 'recvfrom', 'send', 'sendto',
 | |
| 		   'setblocking',
 | |
| 		   'shutdown'):
 | |
| 		exec _s % (_m, _m)
 | |
| 
 | |
| 
 | |
| class _fileobject:
 | |
| 
 | |
| 	def __init__(self, sock, mode, bufsize):
 | |
| 		self._sock = sock
 | |
| 		self._mode = mode
 | |
| 		if bufsize < 0:
 | |
| 			bufsize = 512
 | |
| 		self._rbufsize = max(1, bufsize)
 | |
| 		self._wbufsize = bufsize
 | |
| 		self._wbuf = self._rbuf = ""
 | |
| 
 | |
| 	def close(self):
 | |
| 		try:
 | |
| 			if self._sock:
 | |
| 				self.flush()
 | |
| 		finally:
 | |
| 			self._sock = 0
 | |
| 
 | |
| 	def __del__(self):
 | |
| 		self.close()
 | |
| 
 | |
| 	def flush(self):
 | |
| 		if self._wbuf:
 | |
| 			self._sock.send(self._wbuf)
 | |
| 			self._wbuf = ""
 | |
| 
 | |
| 	def fileno(self):
 | |
| 		return self._sock.fileno()
 | |
| 
 | |
| 	def write(self, data):
 | |
| 		self._wbuf = self._wbuf + data
 | |
| 		if self._wbufsize == 1:
 | |
| 			if '\n' in data:
 | |
| 				self.flush()
 | |
| 		else:
 | |
| 			if len(self._wbuf) >= self._wbufsize:
 | |
| 				self.flush()
 | |
| 
 | |
| 	def writelines(self, list):
 | |
| 		filter(self._sock.send, list)
 | |
| 		self.flush()
 | |
| 
 | |
| 	def read(self, n=-1):
 | |
| 		if n >= 0:
 | |
| 			while len(self._rbuf) < n:
 | |
| 				new = self._sock.recv(self._rbufsize)
 | |
| 				if not new: break
 | |
| 				self._rbuf = self._rbuf + new
 | |
| 			data, self._rbuf = self._rbuf[:n], self._rbuf[n:]
 | |
| 			return data
 | |
| 		while 1:
 | |
| 			new = self._sock.recv(self._rbufsize)
 | |
| 			if not new: break
 | |
| 			self._rbuf = self._rbuf + new
 | |
| 		data, self._rbuf = self._rbuf, ""
 | |
| 		return data
 | |
| 
 | |
| 	def readline(self):
 | |
| 		import string
 | |
| 		data = ""
 | |
| 		i = string.find(self._rbuf, '\n')
 | |
| 		while i < 0:
 | |
| 			new = self._sock.recv(self._rbufsize)
 | |
| 			if not new: break
 | |
| 			i = string.find(new, '\n')
 | |
| 			if i >= 0: i = i + len(self._rbuf)
 | |
| 			self._rbuf = self._rbuf + new
 | |
| 		if i < 0: i = len(self._rbuf)
 | |
| 		else: i = i+1
 | |
| 		data, self._rbuf = self._rbuf[:i], self._rbuf[i:]
 | |
| 		return data
 | |
| 
 | |
| 	def readlines(self):
 | |
| 		list = []
 | |
| 		while 1:
 | |
| 			line = self.readline()
 | |
| 			if not line: break
 | |
| 			list.append(line)
 | |
| 		return list
 | |
| 
 | |
| 
 | |
| # WSA error codes
 | |
| errorTab = {}
 | |
| errorTab[10004] = "The operation was interrupted."
 | |
| errorTab[10009] = "A bad file handle was passed."
 | |
| errorTab[10013] = "Permission denied."
 | |
| errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
 | |
| errorTab[10022] = "An invalid operation was attempted."
 | |
| errorTab[10035] = "The socket operation would block"
 | |
| errorTab[10036] = "A blocking operation is already in progress."
 | |
| errorTab[10048] = "The network address is in use."
 | |
| errorTab[10054] = "The connection has been reset."
 | |
| errorTab[10058] = "The network has been shut down."
 | |
| errorTab[10060] = "The operation timed out."
 | |
| errorTab[10061] = "Connection refused."
 | |
| errorTab[10063] = "The name is too long."
 | |
| errorTab[10064] = "The host is down."
 | |
| errorTab[10065] = "The host is unreachable."
 | 
