Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 80b0fa0

Browse files
committed
socket wrapper module around _socket for all Window platforms
1 parent ca318ec commit 80b0fa0

2 files changed

Lines changed: 272 additions & 0 deletions

File tree

Lib/plat-win/socket.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
"Socket wrapper for Windows, which does not support dup()."
2+
3+
print "new socket.py loading"
4+
5+
# (And hence, fromfd() and makefile() are unimplemented in C....)
6+
7+
# XXX Living dangerously here -- close() is implemented by deleting a
8+
# reference. Thus we rely on the real _socket module to close on
9+
# deallocation, and also hope that nobody keeps a reference to our _sock
10+
# member.
11+
12+
13+
14+
try:
15+
from _socket import *
16+
except ImportError:
17+
from socket import *
18+
19+
_realsocketcall = socket
20+
21+
22+
def socket(family, type, proto=0):
23+
return _socketobject(_realsocketcall(family, type, proto))
24+
25+
26+
class _socketobject:
27+
28+
def __init__(self, sock):
29+
print "creating _socketobject", sock
30+
self._sock = sock
31+
32+
def close(self):
33+
self._sock = None
34+
35+
def __del__(self):
36+
self.close()
37+
38+
def accept(self):
39+
sock, addr = self._sock.accept()
40+
return _socketobject(sock), addr
41+
42+
def dup(self):
43+
return _socketobject(self._sock)
44+
45+
def makefile(self, mode='r', bufsize=-1):
46+
return _fileobject(self._sock, mode, bufsize)
47+
48+
_s = "def %s(self, *args): return apply(self._sock.%s, args)\n\n"
49+
for _m in ('bind', 'connect', 'fileno', 'listen',
50+
'getpeername', 'getsockname',
51+
'getsockopt', 'setsockopt',
52+
'recv', 'recvfrom', 'send', 'sendto',
53+
'setblocking',
54+
'shutdown'):
55+
exec _s % (_m, _m)
56+
57+
58+
class _fileobject:
59+
60+
def __init__(self, sock, mode, bufsize):
61+
self._sock = sock
62+
self._mode = mode
63+
if bufsize < 0:
64+
bufsize = 512
65+
self._rbufsize = max(1, bufsize)
66+
self._wbufsize = bufsize
67+
self._wbuf = self._rbuf = ""
68+
69+
def close(self):
70+
try:
71+
if self._sock:
72+
self.flush()
73+
finally:
74+
self._sock = None
75+
76+
def __del__(self):
77+
self.close()
78+
79+
def flush(self):
80+
if self._wbuf:
81+
self._sock.send(self._wbuf)
82+
self._wbuf = ""
83+
84+
def fileno(self):
85+
return self._sock.fileno()
86+
87+
def write(self, data):
88+
self._wbuf = self._wbuf + data
89+
if self._wbufsize == 1:
90+
if '\n' in data:
91+
self.flush()
92+
else:
93+
if len(self._wbuf) >= self._wbufsize:
94+
self.flush()
95+
96+
def writelines(self, list):
97+
filter(self._sock.send, list)
98+
self.flush()
99+
100+
def read(self, n=-1):
101+
if n >= 0:
102+
while len(self._rbuf) < n:
103+
new = self._sock.recv(self._rbufsize)
104+
if not new: break
105+
self._rbuf = self._rbuf + new
106+
data, self._rbuf = self._rbuf[:n], self._rbuf[n:]
107+
return data
108+
while 1:
109+
new = self._sock.recv(self._rbufsize)
110+
if not new: break
111+
self._rbuf = self._rbuf + new
112+
data, self._rbuf = self._rbuf, ""
113+
return data
114+
115+
def readline(self):
116+
import string
117+
data = ""
118+
i = string.find(self._rbuf, '\n')
119+
while i < 0:
120+
new = self._sock.recv(self._rbufsize)
121+
if not new: break
122+
i = string.find(new, '\n')
123+
if i >= 0: i = i + len(self._rbuf)
124+
self._rbuf = self._rbuf + new
125+
if i < 0: i = len(self._rbuf)
126+
else: i = i+1
127+
data, self._rbuf = self._rbuf[:i], self._rbuf[i:]
128+
return data
129+
130+
def readlines(self):
131+
list = []
132+
while 1:
133+
line = self.readline()
134+
if not line: break
135+
list.append(line)
136+
return list

Lib/win/socket.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
"Socket wrapper for Windows, which does not support dup()."
2+
3+
print "new socket.py loading"
4+
5+
# (And hence, fromfd() and makefile() are unimplemented in C....)
6+
7+
# XXX Living dangerously here -- close() is implemented by deleting a
8+
# reference. Thus we rely on the real _socket module to close on
9+
# deallocation, and also hope that nobody keeps a reference to our _sock
10+
# member.
11+
12+
13+
14+
try:
15+
from _socket import *
16+
except ImportError:
17+
from socket import *
18+
19+
_realsocketcall = socket
20+
21+
22+
def socket(family, type, proto=0):
23+
return _socketobject(_realsocketcall(family, type, proto))
24+
25+
26+
class _socketobject:
27+
28+
def __init__(self, sock):
29+
print "creating _socketobject", sock
30+
self._sock = sock
31+
32+
def close(self):
33+
self._sock = None
34+
35+
def __del__(self):
36+
self.close()
37+
38+
def accept(self):
39+
sock, addr = self._sock.accept()
40+
return _socketobject(sock), addr
41+
42+
def dup(self):
43+
return _socketobject(self._sock)
44+
45+
def makefile(self, mode='r', bufsize=-1):
46+
return _fileobject(self._sock, mode, bufsize)
47+
48+
_s = "def %s(self, *args): return apply(self._sock.%s, args)\n\n"
49+
for _m in ('bind', 'connect', 'fileno', 'listen',
50+
'getpeername', 'getsockname',
51+
'getsockopt', 'setsockopt',
52+
'recv', 'recvfrom', 'send', 'sendto',
53+
'setblocking',
54+
'shutdown'):
55+
exec _s % (_m, _m)
56+
57+
58+
class _fileobject:
59+
60+
def __init__(self, sock, mode, bufsize):
61+
self._sock = sock
62+
self._mode = mode
63+
if bufsize < 0:
64+
bufsize = 512
65+
self._rbufsize = max(1, bufsize)
66+
self._wbufsize = bufsize
67+
self._wbuf = self._rbuf = ""
68+
69+
def close(self):
70+
try:
71+
if self._sock:
72+
self.flush()
73+
finally:
74+
self._sock = None
75+
76+
def __del__(self):
77+
self.close()
78+
79+
def flush(self):
80+
if self._wbuf:
81+
self._sock.send(self._wbuf)
82+
self._wbuf = ""
83+
84+
def fileno(self):
85+
return self._sock.fileno()
86+
87+
def write(self, data):
88+
self._wbuf = self._wbuf + data
89+
if self._wbufsize == 1:
90+
if '\n' in data:
91+
self.flush()
92+
else:
93+
if len(self._wbuf) >= self._wbufsize:
94+
self.flush()
95+
96+
def writelines(self, list):
97+
filter(self._sock.send, list)
98+
self.flush()
99+
100+
def read(self, n=-1):
101+
if n >= 0:
102+
while len(self._rbuf) < n:
103+
new = self._sock.recv(self._rbufsize)
104+
if not new: break
105+
self._rbuf = self._rbuf + new
106+
data, self._rbuf = self._rbuf[:n], self._rbuf[n:]
107+
return data
108+
while 1:
109+
new = self._sock.recv(self._rbufsize)
110+
if not new: break
111+
self._rbuf = self._rbuf + new
112+
data, self._rbuf = self._rbuf, ""
113+
return data
114+
115+
def readline(self):
116+
import string
117+
data = ""
118+
i = string.find(self._rbuf, '\n')
119+
while i < 0:
120+
new = self._sock.recv(self._rbufsize)
121+
if not new: break
122+
i = string.find(new, '\n')
123+
if i >= 0: i = i + len(self._rbuf)
124+
self._rbuf = self._rbuf + new
125+
if i < 0: i = len(self._rbuf)
126+
else: i = i+1
127+
data, self._rbuf = self._rbuf[:i], self._rbuf[i:]
128+
return data
129+
130+
def readlines(self):
131+
list = []
132+
while 1:
133+
line = self.readline()
134+
if not line: break
135+
list.append(line)
136+
return list

0 commit comments

Comments
 (0)