【问题标题】:Why is this Python code only listening on one port?为什么这个 Python 代码只监听一个端口?
【发布时间】:2013-11-20 13:38:48
【问题描述】:

我正在尝试编写一段 python 代码来监听两个不同的端口。在 Java 中,我可以简单地通过启动一个在每个端口上侦听的线程来做到这一点,但它看起来确实在 Python 中以这种方式工作。我到目前为止的代码是:

from socket import *
import thread
from datetime import datetime

BUFF_SIZE = 1024
HOST = '' # listen on all interfaces
PORT_FTP = 5000 # port to listen on
PORT_ESMTP = 5001 # TODO: change to real port

# HEADERS #################################
headerFtpGuild = "220-GuildFTPd FTP Server (c) 1997-2002\r\n220-Version 0.999.14\r\n"
headerFtpCerberus = "220-Cerberus FTP Server Personal Edition\r\n220-UNREGISTERED\r\n";
headerESMTP = "220 ESMTP service ready\r\n250\x20ok\r\n";
###########################################

def handlerFTP(clientsock,addr):
    try:
        clientsock.send(headerFtpGuild)
        print '[*] Faked FTP banner'
        clientsock.close()
    except:
        pass

def handlerESMTP(clientsock,addr):
    try:
        clientsock.send(headerESMTP)
        print '[*] Faked ESMTP banner'
        clientsock.close()
    except:
        pass

def getTime():
    return datetime.now().strftime('%Y-%m-%d %H:%M:%S')


def listenFTP():
    ADDR = (HOST, PORT_FTP)
    serversock = socket(AF_INET, SOCK_STREAM)
    serversock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    serversock.bind(ADDR)
    serversock.listen(1)

    print '[*]FTP'

    while 1:
        clientsock, addr = serversock.accept()
        print '[ ] possible probe detected from:', addr[0], '@', getTime()
        thread.start_new_thread(handlerFTP, (clientsock, addr))

def listenESMTP():
    ADDR = (HOST, PORT_ESMTP)
    serversock1 = socket(AF_INET, SOCK_STREAM)
    serversock1.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    serversock1.bind(ADDR)
    serversock1.listen(1)

    print '[*]ESMTP'

    while 1:
        clientsock1, addr1 = serversock1.accept()
        print '[ ] possible probe detected from:', addr1[0], '@', getTime()
        thread.start_new_thread(handlerESMTP, (clientsock1, addr1))

if __name__=='__main__':
    listenFTP()
    listenESMTP()

似乎只有 listenFTP() 正在执行。我能做些什么呢?提前致谢。

【问题讨论】:

  • 问问自己:“listenFTP() 是做什么的?”,你就会得到答案。
  • listen() 通常是一个阻塞调用。使用多处理同时操作这两个功能。
  • @georgesl:不相关。
  • @Michael Foukarakis - 我完全错过了。谢谢!

标签: python sockets tcp listen


【解决方案1】:

我认为基本上你没有在你的 python 代码中使用线程。您启动 FTP 侦听器,当然,此方法将执行永远。您可以使用thread.start_new_thread 函数添加快速修复,如下所示:

if __name__=='__main__':
    import thread
    thread.start_new_thread(listenFTP)
    thread.start_new_thread(listenESMTP)

希望这会有所帮助!

【讨论】:

  • 不过,通常使用更高级别的模块threading
【解决方案2】:

尝试将listenFTP()listenESMTP() 放入无限循环或while 循环中。

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2019-09-29
    • 2012-08-20
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多