Ejemplo n.º 1
0
    def start_tcp_server(self, ip, port, flag, error):
        """
		功能描述:开启TCP Server
		
		参数:
			ip: TCP server所在主机IP地址
			port: TCP Server监听的端口号
			flag: 服务器运行标识
			error: 服务器运行的错误信息
		"""

        if check_port_status(ip, port):
            try:
                factory = protocol.Factory()
                factory.protocol = TSServProtocol

                log_data = "waiting for connection..."
                log.debug_info(log_data)

                reactor.listenTCP(port, factory, interface=ip)
                reactor.callLater(1, self._check_flag, flag)
                reactor.run()

            except Exception, e:
                log_data = "ListenTCP occurs exception, error info is %s" % e
                log.debug_info(log_data)
                flag.value = 3  # 开启服务器监听发生异常
                error.value = log_data
Ejemplo n.º 2
0
class ATTTCPServer(object):
    """
	ATTTCPServer
	"""
    def __init__(self):

        self.obj = MyTCPServer()
        self.flag = Value('i', 1)  # 初始共享内存变量
        self.error = Array('c', 128)  # 初始化共享内存变量
        self.start_flag = 0  # 服务器是否已经开启的标志,为0,表示没有开启

    def start_tcp_server(self, ip, port):
        """
		功能描述:开启TCP Server
		
		参数:
			ip: TCP server所在主机IP地址
			port: TCP Server监听的端口号
		"""

        # 创建子进程启动TCP Server
        try:
            sub_process = Process(target=self.obj.start_tcp_server,
                                  args=(ip, port, self.flag, self.error))
            sub_process.start()
        except Exception, e:
            log_data = "Start TCP Server occurs exception, error info is: %s" % e
            log.debug_err(log_data)
            return ATTTCPSERVER_FAIL, log_data

        # 等待5s,检测服务器启动是否成功
        time.sleep(5)
        if self.flag.value == 2:
            log_data = u"地址%s 的%s 端口已经被占用,请使用其他端口." % (ip, str(port))
            # 返回之前还原状态标志
            self.flag.value = 1
            self.error.value = " "
            return ATTTCPSERVER_FAIL, log_data

        elif self.flag.value == 3:
            self.obj.stop_tcp_server(self.flag)
            log_data = u"TCP Server启动失败,错误信息为:%s." % self.error.value
            # 返回之前还原状态标志
            self.flag.value = 1
            self.error.value = " "
            return ATTTCPSERVER_FAIL, log_data

        else:
            if check_port_status(ip, port):
                # TCPListen失败,退出reactor.run()
                self.obj.stop_tcp_server(self.flag)
                log_data = u"TCP Server启动失败,TCPListen失败."
                # 返回之前还原状态标志
                self.flag.value = 1
                self.error.value = " "
                return ATTTCPSERVER_FAIL, log_data
            else:
                self.start_flag = 1
                log_data = u"TCP Server启动成功"
                return ATTTCPSERVER_SUC, log_data
Ejemplo n.º 3
0
    def _send_udp_package(self, dst_ip, dst_port, send_msg, status):
        """
		功能描述:发送udp报文到UDP Server,并接收回应,验证链路是否通
		
		参数:
			dst_ip: UDP报文的目的IP
			dst_port: UDP报文的目的port
			send_msg: UDP报文的消息内容
			status: 链路状态,为1,表示链路正常,为2,表示端口被占用,为3表示connectTCP发生异常,负数表示失败的次数,为0表示链路不通
			
		返回值:
			ATTUDPCLIENT_SUC, log_data 表示通
			ATTUDPCLIENT_FAIL, log_data 表示不通
			ATTUDPCLIENT_PORT_BUSY, log_data 表示端口被占用 
		"""

        # 检测端口是否被占用,如果源端口为0,表示不用指定源端口,则不用检测
        if self.src_port == 0 or check_port_status(self.src_ip, self.src_port,
                                                   "UDP"):

            # 设置目的IP和目的端口
            TSClntDatagramProtocol.dst_ip = dst_ip
            TSClntDatagramProtocol.dst_port = int(dst_port)

            # 设置发送的消息,如果send_msg是列表则直接赋值,如果不是列表,则将send_msg加入到TSClntDatagramProtocol.send_data列表中
            if type(send_msg) == type([]):
                TSClntDatagramProtocol.send_data = send_msg
            else:
                TSClntDatagramProtocol.send_data.append(send_msg)

            protocol = TSClntDatagramProtocol()
            try:
                # 判断是否需要绑定源端口
                if self.src_port == 0:
                    reactor.listenUDP(0, protocol)
                else:
                    reactor.listenUDP(self.src_port,
                                      protocol,
                                      interface=self.src_ip)

                reactor.callLater(30, self._check_recv_flag)
                reactor.run()
            except Exception, e:
                status.value = 3
                log_data = "send udp package ocurrs exception, error info is %s" % e
                log.debug_info(log_data)

            if TSClntDatagramProtocol.connection_status:
                fail_num = TSClntDatagramProtocol.connection_status.count(0)
                if fail_num == 0:
                    # 没有失败的记录,发送报文全部成功
                    status.value = 1

                else:
                    # 有失败记录,返回失败的次数,用负数表示
                    status.value = -fail_num
            else:
                status.value = 0
Ejemplo n.º 4
0
    def _send_tcp_package(self, dst_ip, dst_port, send_msg, status):
        """
		功能描述:发送tcp报文到TCP Server,并接收回应,验证链路是否通
		
		参数:
			dst_ip: TCP报文的目的IP
			dst_port: TCP报文的目的port
			send_msg: TCP报文的消息内容
			status: 链路状态,为1,表示链路正常,为2,表示端口被占用,为3表示connectTCP发生异常,负数表示失败的次数,为0表示链路不通
			
		返回值:
			ATTTCPCLIENT_SUC, log_data 表示通
			ATTTCPCLIENT_FAIL, log_data 表示不通
			ATTTCPCLIENT_PORT_BUSY, log_data 表示端口被占用 
		"""

        # 检测端口是否被占用,如果源端口为0,表示不用指定源端口,则不用检测
        if self.src_port == 0 or check_port_status(self.src_ip, self.src_port):

            # 设置发送的消息,如果send_msg是列表则直接赋值,如果不是列表,则将send_msg加入到TSClntProtocol.send_data列表中
            if type(send_msg) == type([]):
                TSClntProtocol.send_data = send_msg
            else:
                TSClntProtocol.send_data.append(send_msg)

            try:
                # 判断是否需要绑定源端口
                if self.src_port == 0:
                    reactor.connectTCP(dst_ip, int(dst_port), TSClntFactory())
                else:
                    reactor.connectTCP(dst_ip,
                                       int(dst_port),
                                       TSClntFactory(),
                                       bindAddress=(self.src_ip,
                                                    self.src_port))

                reactor.run()
            except Exception, e:
                status.value = 3
                log_data = "send tcp package ocurrs exception, error info is %s" % e
                log.debug_info(log_data)

            if TSClntProtocol.connection_status:
                fail_num = TSClntProtocol.connection_status.count(0)
                if fail_num == 0:
                    # 没有失败的记录,发送报文全部成功
                    status.value = 1

                else:
                    # 有失败记录,返回失败的次数,用负数表示
                    status.value = -fail_num
            else:
                status.value = 0
Ejemplo n.º 5
0
	def start_udp_server(self, ip, port, flag, error):
		"""
		功能描述:开启UDP Server
		
		参数:
			ip: UDP server所在主机IP地址
			port: UDP Server监听的端口号
			flag: 服务器运行标识
		"""
		
		if check_port_status(ip, port, "UDP"):
			try:
				reactor.listenUDP(port, TSServDatagramProtocol(), interface=ip)
				reactor.callLater(1, self._check_flag, flag)
				reactor.run()
			except Exception,e:
				log_data = "ListenUDP occurs exception, error info is %s" % e
				log.debug_info(log_data)
				flag.value = 3
				error.value = log_data