socket是網絡編程的基礎,本文用打電話來類比socket通信中建立TCP連接的過程。
socket函數,表示你買了或者借了一部手機。
bind函數,告訴別人你的手機號碼,讓他們給你打電話。
listen函數,打開手機的鈴聲,而不是靜音,這樣有電話時可以立馬反應。listen函數的第二個參數,最大連接數,表示最多有幾個人可以同時撥打你的號碼。不過我們的手機,最多只能有一個人打進來,要不然就提示占線。
connect函數,你的朋友知道了你的號碼,通過這個號碼來聯系你。在他等待你回應的時候,不能做其他事情,所以connect函數是阻塞的。
accept函數,你聽到了電話鈴聲,接電話,accept it!然后“喂”一聲,你的朋友聽到你的回應,知道電話已經打進去了。至此,一個TCP連接建立了。
read/write函數,連接建立后,TCP的兩端可以互相收發消息,這時候的連接是全雙工的。對應打電話中的電話煲。
close函數,通話完畢,一方說“我掛了”,另一方回應"你掛吧",然后將連接終止。實際的close(sockfd)有些不同,它不止是終止連接,還把手機也歸還,不在占有這部手機,就當是公用電話吧。
注意到,上述連接是阻塞的,你一次只能響應一個用戶的連接請求,但在實際網絡編程中,一個服務器服務于多個客戶,上述方案也就行不通了,怎么辦?想一想1860,移動的聲訊服務臺,也是只有一個號碼,它怎么能同時服務那么多人呢?可以這樣理解,在你打電話到1860時,總服務臺會讓一個接線員來為你服務,而它自己卻繼續監聽有沒有新的電話接入。在網絡編程中,這個過程類似于fork一個子進程,建立實際的通信連接,而主進程繼續監聽。1860的接線員是有限的,所以當連接的人數達到上線時,它會放首歌給你聽,忙等待,直到有新的空閑接線員為止。
實際網絡編程中,處理并發的方式還有select/poll/epoll等。
下面是一個實際的socket通信過程:
posted @
2008-10-26 17:09 ronliu 閱讀(4080) |
評論 (4) |
編輯 收藏
面試百度時,面試官問我,如何統計一個文本文件的行數,可以使用一種腳本語言。汗,我告訴他,用for循環,一行行地去讀吧。然后聽見面試官很小心的咕噥了一句,wc這種常用命令也不知道呀。:(
本文只是列出了各個命令的簡要功能,欲知詳情,man吧!
ls 顯示目錄中的文件名
ps 查看當前進程快照
kill 向進程發送一個信號,如殺死進程
more 顯示文本文件,但一次只顯示一屏
sort 按行對文本文件進行排序
chmod 改變文件的模式,如可執行+x
echo 輸出變量的值
read 將用戶的輸入賦給變量
env 在一個被改變了的環境中運行程序
test 檢測文件的類型,比較值。例如檢測文件是否存在,字符串比較等
touch 檢測文件是否存在,如果不存在就創建它
rm 刪除一個文件或者目錄
wc 顯示文本文件的行數、字數信息
cp 復制文件或目錄,常用參數-r, -u
mkdir 創建目錄
ln 在文件之間創建鏈接
內部命令:
break 跳出當前循環
continue 跳出本次循環,繼續下一次循環
:空命令,相當于true的別名
. 用來執行shell中的命令,類型與#include
eval 允許你對參數求值,有點像一個而外的$,他給出一個變量值的值
exec 將當前的shell替換一個不同的程序,其之后的代碼不會執行
exit n 退出碼 n
export 將作為它參數的變量到處到子shell中,作為子進程的環境變量
expr 將參數當作表達式來求值,如簡單的數學運算
`` 對反引號內的代碼當作命令執行,求的結果賦給變量
return 是函數返回
set 為shell設置參數變量 set $(date),將當前date作為參數
shift 所有參數變量左移1個位置$3變為$2
trap 用于接收到指定信號后將要采取的行動,如INT CTRL+C。即可以設定Ctrl+C后,程序如何響應。
unset 從環境中刪除變量或函數
find 查找文件 find [path] [option] [test] [action]
option包括find深度,是否find mount的文件夾等,test包括name, mtime,action例如print,exec
編程相關命令:
strings 打印文件中的可打印字符,如查看一個可執行文件中的可打印字符。
nm 列出對象文件(object files)的符號列表,如查看用gcc編譯出來的可執行文件的符號列表。
strip 刪除對象文件中的符號列表。這樣可以使得可執行文件有更小的體積。
strace 很強大的命令,顯示所有由用戶空間程序發出的系統調用。用于調試。
posted @
2008-10-17 16:48 ronliu 閱讀(664) |
評論 (0) |
編輯 收藏
從星期五晚上開始,一直在裝系統,甚至于昨天晚上還熬通宵擺弄這東西。只是到目前為止,手頭上的這個Linux系統仍然問題重重,不堪使用。明天又是新的一天,工作日,重裝系統的愛好就得先放放了。以下是這兩天的“成果”。
~修改Grub引導區失敗一次,導致RedHat9無法引導,電腦無法啟動,借光驅格盤。
~Ubuntu8.04硬盤安裝一次,失敗,原因同上,Grub引導出錯。
~Ubuntu8.04 Wubi安裝兩次,體驗了傳說中的Ubuntu,但無法上網,基本等同于廢物了,比較適合初學者。
~RedHat9安裝一次。字體配置文件丟失,Wine無法安裝,無賴重裝,但在我的電腦上僅存1天不到。
~SuSe硬盤安裝一次,用的比較舒服,Wine成功,Qt失敗,聲音解碼器失敗,gcc編譯器向下兼容……
~U盤安裝系統一次,失敗,電腦無法從U盤引導,或許是引導盤沒做好,但已經沒興趣了,借光驅ing
~光盤安裝Windows2003一次,將無法引導的那個機器恢復,oye!
~比較FC,Ubuntu,Suse,RedHat,各個的優缺點。
其間出過U盤被分區無法識別的烏龍,也學會單用戶登錄,修改Grub入門,等等,但總的來說,這個周末收獲不大。目前這臺電腦上幸存三個系統,Suse10,WinXP,Ubuntu(Wubi)。整個周末都耗在這個上面了,很無語。無論如何,進一段時間再重裝這臺機器了,太無聊。生命中還有很多美好的事情可以體驗,比如睡覺!
posted @
2008-06-15 23:08 ronliu 閱讀(295) |
評論 (0) |
編輯 收藏
RedHat9, 在安裝光盤中的KDE包后, 無法進入X. 以下為解決過程.
1. 以單用戶的模式進入Linux
參考2. 修改啟動文件/etc/inittab, id:5:initdefalut: 將5改為3
3. 在文字模式下, startx, 嘗試啟動X11. 報錯.
Could not open default font "fixed"
注釋掉/etc/X11/XF86Config中的 FontPath "unix/:7100", startx, 回到久違的X11
參考說明
--------
1. 進入grub模式下, 也可以進入單用戶狀態, 但沒有成功.
2. 以為字體丟失, 打算重新安裝系統盤中的XFree86包, 提示已安裝. (需要先將文件從光盤復制到其他盤)
posted @
2008-06-12 21:44 ronliu 閱讀(315) |
評論 (0) |
編輯 收藏
一 基礎命令
掛載: mount /dev/sda /mnt/usb
卸載: umount /mnt/usb
參數:
-t vfat 指定掛載盤的類型
-o 為掛載指定可選項, 如charset等
-l 強制卸載磁盤
二 亂碼
在掛載時需要指定字符集. 對于U盤, mount /dev/sda /mnt/usb -o iocharset=cp936. 對于掛到Linux下的其他Winodw盤, 需要使用vim /etc/fstab命令修改配置文件, /dev/hdb7 /mnt/f vfat iocharset=cp936,defaults 0 0.
系統RedHat9.0, 其他系統或有不同, 需要找到對應中文字符集. 如cp950, gb2312
三 大小寫
有些短文件名, 如果全大寫, 會顯示為全小寫. 影響使用. 在掛載時, 加上
shortname=mixed的參數即可解決.
四 說明
注意到, 將這些掛載磁盤的選項寫入到/etc/fstab中, 可在系統啟動時自動加載.
posted @
2008-06-11 15:03 ronliu 閱讀(337) |
評論 (0) |
編輯 收藏
1.
<script>

function test(object)
{
alert(object.value);
}

</script>

<input type="button" name="one" value="one" onclick="test(this)">

<input type="button" name="tow" value="tow" onclick="test(this)">
function test()
{
var object =event.srcElement // 得到調用者的引用 object
alert(object.value);
}
posted @
2008-05-31 16:11 ronliu 閱讀(1935) |
評論 (0) |
編輯 收藏
1. 在window.showModalDialog的彈出對話框中,刷新父頁面。
window.opener.location.href=window.opener.location.href
posted @
2008-05-31 15:07 ronliu 閱讀(272) |
評論 (0) |
編輯 收藏
在開發中,測試的數據庫服務器和正式的通常不在一起。這就涉及到數據庫連接的更新。在丟失過一次所有字段之后,發現是自己想復雜了。數據庫-》設置數據源位置。OK。
但我的報表中有一個以XML為數據源的子報表,在設置數據源位置時,CR總是死掉,刪除這個子報表后一切正常了。原因未知。
報表更復雜一些,參見:
http://topic.csdn.net/t/20031113/17/2457889.html#
posted @
2008-05-30 16:26 ronliu 閱讀(1294) |
評論 (0) |
編輯 收藏