diff options
-rwxr-xr-x | Lib/plat-win/socket.py | 136 | ||||
-rwxr-xr-x | Lib/win/socket.py | 136 |
2 files changed, 272 insertions, 0 deletions
diff --git a/Lib/plat-win/socket.py b/Lib/plat-win/socket.py new file mode 100755 index 0000000..ec016f4 --- /dev/null +++ b/Lib/plat-win/socket.py @@ -0,0 +1,136 @@ +"Socket wrapper for Windows, which does not support dup()." + +print "new socket.py loading" + +# (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): + print "creating _socketobject", sock + self._sock = sock + + def close(self): + self._sock = None + + 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', '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 = None + + 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 diff --git a/Lib/win/socket.py b/Lib/win/socket.py new file mode 100755 index 0000000..ec016f4 --- /dev/null +++ b/Lib/win/socket.py @@ -0,0 +1,136 @@ +"Socket wrapper for Windows, which does not support dup()." + +print "new socket.py loading" + +# (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): + print "creating _socketobject", sock + self._sock = sock + + def close(self): + self._sock = None + + 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', '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 = None + + 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 |