2012年10月8日星期一

Socket programming好容易

先來看一段代碼:
exec 3<>/dev/tcp/www.fedora.org/80 &
echo -e "GET /
" >&3
cat <&3

bash可以用這種形式:/dev/tcp/<hostname>/<port>建立tcp連接,但只限用exec執行。
(因為實際上並不存在這個文件)
3<>這個其實是定義一個file descriptor,號碼是3
可以讀取又可以寫入
然後可以用&3當成普通檔案讀寫
因為www.fedora.org在80port跑的是http server,給它傳一個GET就會返回首頁容
可以用bash做基於明文的tcp socket programming


事實上udp也是支援的,只要把地址中的tcp換成udp即何
例如:/dev/udp/<hostname>/<port>

關於bash的文件描述符,定義方法是:>或<前面加數字
<是讀取,>是寫入,<>兩個一起就是同時讀取和寫入
bash預設已經打開了012二個描述符,它們是stdin, stdout, stderr
也能用&2來當成普通文件寫入stderr
2>&1就是把stderr重定向去stdout
(題外話:$ ls /adksjdkfjas 2>&1 > /dev/null
這樣照樣會有輸出,因為先把stderr重定向去stdin。然後才把stdin重定向去/dev/null。
這樣stderr的實際值應該是原來的stdin。)

Via:
Advanced Bash-Scripting Guide: I/O Redirection
Bash Socket Programming

SEO: bash socket programming bash file descriptor I/O redirection
發佈留言

熱門文章