1
2 '''
3 Default UDP publishers.
4
5 @author: Michael Eddington
6 @version: $Id: Peach.Publishers.udp-pysrc.html 1138 2008-08-16 19:39:03Z meddingt $
7 '''
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 import socket, time
38 from Peach.publisher import *
39 import Peach
40
44
45 -class Udp(Publisher):
46 '''
47 A simple UDP publisher.
48 '''
49
50 - def __init__(self, host, port, timeout = None):
51 '''
52 @type host: string
53 @param host: Remote hostname
54 @type port: number
55 @param port: Remote port
56 '''
57 self._host = host
58 self._port = port
59 self._timeout = timeout
60
61 if self._timeout == None:
62 self._timeout = 2
63
64 else:
65 self._timeout = timeout
66
67 self._socket = None
68 self.buff = ""
69 self.pos = 0
70
72 '''Close connection if open'''
73 self.close()
74
81
90
91 - def send(self, data):
92 '''
93 Send data via sendall.
94
95 @type data: string
96 @param data: Data to send
97 '''
98 self._socket.sendall(data)
99
101 '''
102 This is now a buffered receiver.
103
104 @rtype: string
105 @return: received data.
106 '''
107
108
109 if size+self.pos < len(self.buff):
110 ret = self.buff[self.pos:self.pos+size]
111 self.pos += size
112 return ret
113
114
115 diffSize = (self.pos+size) - len(self.buff)
116
117 try:
118 self._socket.settimeout(float(self._timeout))
119 ret = self._socket.recv(65507)
120
121 Debug("udp.Udp.receive we got:")
122 Debug(repr(ret))
123
124 if not ret:
125
126 raise PublisherSoftException("Socket is closed")
127
128 self.buff += ret
129
130 except socket.error, e:
131 if str(e).find('The socket operation could not complete without blocking') == -1:
132 raise Timeout("Timed out waiting for data [%d:%d:%d:%d]" % (len(self.buff), (size+self.pos), size, diffSize))
133
134 else:
135 raise PublisherSoftException("recv failed: " + str(sys.exc_info()[1]))
136
137 finally:
138 self._socket.settimeout(None)
139
140 ret = self.buff[self.pos:]
141 self.pos = len(self.buff)
142 return ret
143
145 '''
146 Receive as much as possible prior to timeout.
147
148 @rtype: string
149 @return: received data.
150 '''
151 self._socket.settimeout(float(self._timeout))
152
153 try:
154 ret = self._socket.recv(65507)
155
156 Debug("udp.Udp.receive we got:")
157 Debug(repr(ret))
158
159 if not ret:
160 raise PublisherSoftException("Socket is closed")
161
162 self.buff += ret
163
164 except socket.error, e:
165 if str(e).find('The socket operation could not complete without blocking') == -1:
166 pass
167
168 else:
169 raise PublisherSoftException("recv failed: " + str(sys.exc_info()[1]))
170
171 self._socket.settimeout(None)
172
173 ret = self.buff[self.pos:]
174 self.pos = len(self.buff)
175 return ret
176
183
184
185