#Licensed to the Apache Software Foundation (ASF) under one #or more contributor license agreements. See the NOTICE file #distributed with this work for additional information #regarding copyright ownership. The ASF licenses this file #to you under the Apache License, Version 2.0 (the #"License"); you may not use this file except in compliance #with the License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 #Unless required by applicable law or agreed to in writing, software #distributed under the License is distributed on an "AS IS" BASIS, #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #See the License for the specific language governing permissions and #limitations under the License. # $Id:tcp.py 6172 2007-05-22 20:26:54Z zim $ # #------------------------------------------------------------------------------ """ TCP related classes. """ import socket, re, string reAddress = re.compile(":") reMayBeIp = re.compile("^\d+\.\d+\.\d+\.\d+$") reValidPort = re.compile("^\d+$") class Error(Exception): def __init__(self, msg=''): self.message = msg Exception.__init__(self, msg) def __repr__(self): return self.message class tcpError(Error): def __init__(self, message): Error.__init__(self, message) class tcpSocket: def __init__(self, address, timeout=30, autoflush=0): """Constructs a tcpSocket object. address - standard tcp address (HOST:PORT) timeout - socket timeout""" self.address = address self.__autoFlush = autoflush self.__remoteSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__remoteSock.settimeout(timeout) self.host = None self.port = None splitAddress = address if isinstance(address, (tuple, list)): self.host = address[0] self.port = int(address[1]) else: splitAddress = get_address_tuple(address) if not splitAddress[0]: self.host = 'localhost' else: self.host = splitAddress[0] self.port = int(splitAddress[1]) self.__fileObjectOut = '' self.__fileObjectIn = '' def __repr__(self): return self.address def __iter__(self): return self def next(self): sockLine = self.read() if not sockLine: raise StopIteration return sockLine def open(self): """Attempts to open a socket to the specified address.""" socketAddress = (self.host, self.port) try: self.__remoteSock.connect(socketAddress) if self.__autoFlush: self.__fileObjectOut = self.__remoteSock.makefile('wb', 0) else: self.__fileObjectOut = self.__remoteSock.makefile('wb') self.__fileObjectIn = self.__remoteSock.makefile('rb', 0) except: raise tcpError, "connection failure: %s" % self.address def flush(self): """Flushes write buffer.""" self.__fileObjectOut.flush() def close(self): """Attempts to close and open socket connection""" try: self.__remoteSock.close() self.__fileObjectOut.close() self.__fileObjectIn.close() except socket.error, exceptionObject: exceptionMessage = "close failure %s %s" % (self.address, exceptionObject.__str__()) raise tcpError, exceptionMessage def verify(self): """Verifies that a given IP address/host and port are valid. This method will not attempt to open a socket to the specified address. """ isValidAddress = False if reMayBeIp.match(self.host): if check_ip_address(self.host): if reValidPort.match(str(self.port)): isValidAddress = True else: if reValidPort.match(str(self.port)): isValidAddress = True return(isValidAddress) def read(self): """Reads a line off of the active socket.""" return self.__fileObjectIn.readline() def write(self, string): """Writes a string to the active socket.""" print >> self.__fileObjectOut, string def check_net_address(address): valid = True pieces = string.split(address, '.') if len(pieces) != 4: valid = False else: for piece in pieces: if int(piece) < 0 or int(piece) > 255: valid = False return valid def check_ip_address(address): valid = True pieces = string.split(address, '.') if len(pieces) != 4: valid = False else: if int(pieces[0]) < 1 or int(pieces[0]) > 254: valid = False for i in range(1,4): if int(pieces[i]) < 0 or int(pieces[i]) > 255: valid = False return valid def get_address_tuple(address): """ Returns an address tuple for TCP address. address - TCP address of the form host:port returns address tuple (host, port) """ addressList = reAddress.split(address) addressTuple = (addressList[0], int(addressList[1])) return addressTuple