2014-08-29 168 views
0

背景:所以我們在課堂上提供了這個腳本,目的是在我們的Ubuntu虛擬機上打開隨機非特權端口。他給了我們兩個TCP示例,並要求我們打開另外兩個TCP端口以及兩個UDP端口。我們將使用套接字庫和Python編程語言完成此任務。signal.alarm防止腳本執行

所以我最初着眼於他給我們的問題。使用Python終端,這是最後的劇本之前,我最初執行它知道的一般概念將打開端口上的Linux客戶的連接:

#!/usr/bin/env python 

import signal 
import socket 
import sys 
import time 
import os 

s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s5 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s6 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

def tcp_server() : 
    TCP_IP = '127.0.0.1' 

    s1.bind((TCP_IP, 6005)) 
    s2.bind((TCP_IP, 1123)) 
    s3.bind((TCP_IP, 6009)) 
    s4.bind((TCP_IP, 1124)) 
    s5.bind((TCP_IP, 6006)) 
    s6.bind((TCP_IP, 6007)) 

    s1.listen(1) 
    s2.listen(2) 
    s3.listen(3) 
    s4.listen(4) 

tcp_server() 

def SigAlarmHandler(signal, frame) : 
    print("Received alarm TCP server is shutting down") 
    sys.exit(0) 

signal.signal(signal.SIGALRM, SigAlarmHandler) 
signal.alarm(int(sys.argv[1])) 

while True : 
    pass 

當我執行在Ubuntu VM劇本我收到以下錯誤信息:

Traceback (most recent call last): 
    signal.alarm(int(sys.argv[1])) 
IndexError: list index out of range 

因此,我挖了,我發現了這兩個小塊的信息。

signal.alarm Python文檔: https://docs.python.org/2/library/signal.html

Unix手冊頁報警(2) http://unixhelp.ed.ac.uk/CGI/man-cgi?alarm+2

看着它好像所以我不認爲它期待一個int類型的報警男子頁確信明確的數據轉換是必要的。雖然我對劇本的總體方向也沒有信心。教授只是給了我們獎金。他說他會看看,但我不確定他什麼時候會回到我身邊。

我在想這樣的代碼是設置,如果其中一個打開的端口被探測,腳本將終止。看看手冊頁,似乎如果返回的int大於0,則會生成警報。觸發腳本的終止。儘管使用IndexError並且不知道它指的是什麼索引,但我不確定要在哪裏縮小以解決問題。

+0

你是如何運行腳本?你是否100%確定sys.argv [1]存在?你能事先打印嗎? – 2014-08-29 01:37:26

+0

我已經嘗試通過調用python解釋器以及一個簡單的./ScriptName.py來執行。我修改了打印的代碼行(signal.alarm(int(sys.argv [1]))),仍然收到IndexError。 – 2014-08-29 01:42:28

回答

1

最有可能的解釋是,您沒有將任何命令行參數傳遞給您的腳本,並且它是引發IndexError的sys.argv[1]。與信號或套接字無關。

使用./ScriptName.py 5調用腳本,它應該工作,警報將在5秒後觸發,並且服務器應該退出。

參考的情況下,你不熟悉sys.argv中:

+0

謝謝你的文檔。我不知道他爲什麼將這一點加入到這個劇本中。雖然我認爲這次我會更加執着,當我和他一起討論。要真正瞭解他想要實現的目標。 – 2014-08-29 01:54:38

+0

提供的數字是服務器退出前運行多少秒。目前,當它發生套接字連接或UDP數據發送給它時,它不會做任何事情(我認爲),所以它只會在「while True」循環中坐在那裏,直到警報觸發爲止,此時它會退出。 – 2014-08-29 01:57:15