netcat中無參數時的處理(2-1)

在使用netcat時,如果未輸入參數,則此時會彈出“Cmd line”的提示,要求繼續輸入參數,如圖1所示。

 

圖1 Cmd line提示

在netcat源代碼中,會獲取用戶在“Cmd line”中的輸入,將參數提取出來。該段代碼在main()函數中實現。

1 爲參數地址分配內存

在main()函數中,有如下代碼

if (argc == 1)

{

cp = argv[0];

argv = (char**)Hmalloc(128 * sizeof(char*));

argv[0] = cp;

cp = Hmalloc(BIGSIZ);

argv[1] = cp;

fprintf(stderr, "Cmd line:");

fflush(stderr);

        ....

 }

其中,cp在main()函數中定義,

register char *cp;

argc的值是1,則說明用戶只輸入了netcat名字,沒有輸入任何參數。此時,將argv[0]保存在cp中,之後調用自定義Hmalloc()函數動態分配128個字符指針的空間,也就是說,argv可以看成是一個包含128個指針的數組,即表示netcat可以帶128-1=127個參數,最後,再將netcat的第一個參數,即netcat名字的地址保存在數組的第一個元素中中。

2 爲第2個參數分配內存

在爲128個參數地址分配內存,並且指定了第一個參數之後,接下來調用Hmalloc()函數爲第2個參數分配BIGSIZ字節的空間,用於保存第2個參數。其中,BIGSIZ的定義爲

#define BIGSIZ 8192

接下來調用fprintf()函數在控制檯中輸出“Cmd line”,用於提示用戶輸入netcat的參數,最後調用fflush()函數清空stderr流。

3 讀取參數

當在Cmd line提示之後輸入了netcat的參數並且按下回車按鍵之後,netcat應該讀取這些參數。

insaved = _read(0, cp, BIGSIZ);

if (insaved <= 0)

{

bail("wrong");

}

其中,_read()函數的作用是從流中讀取數據,該函數的第一個參數0指定了從標準輸入流中讀取數據;讀取的數據保存在cp指向的內存中;讀取數組的最大字節數是BIGSIZE。insaved中保存了實際讀取的字節數,如果讀取失敗,則insaved的值小於或等於0。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章