在使用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。