資源描述:
《linux socket 編程入門》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、Linuxsocket-編程入門(TCPserver端)通常,socket編程總是Client/Server形式的,因?yàn)橛辛藅elnet,先不考慮client的程序,先寫一個(gè)支持TCP協(xié)議的server端,然后用telnet作為client驗(yàn)證我們的程序。TCPserver端的基本流程????????想象你自己是個(gè)小大佬,坐辦公室(什么樣的黑社會(huì)做辦公室啊?可能是討債公司吧^^)你很土,只有一個(gè)小弟幫你接電話(因?yàn)槟阕约旱奶?hào)碼是不敢對(duì)外公開的)。一次通訊的流程大概應(yīng)該是這樣的:小弟那里的總機(jī)電話響了;小弟接起電話;對(duì)方說(shuō)是你女朋友A妹;小弟轉(zhuǎn)達(dá)說(shuō),“老大,你馬子電話”
2、;你說(shuō),接過(guò)來(lái);小弟把電話接給你;你和你女朋友聊天半小時(shí);掛電話。????????分析一下整個(gè)過(guò)程中的元素。你小弟(listenSock),你需要他來(lái)監(jiān)聽(listen)電話;你自己(communicationSock),實(shí)際上打電話進(jìn)行交流的是你自己;你的電話號(hào)碼(servAddr),否則你女朋友怎么能找到你?你女朋友的電話號(hào)碼(clntAddr),這個(gè)比喻有點(diǎn)牽強(qiáng),因?yàn)槭聦?shí)上你接起電話,不需要知道對(duì)方的號(hào)碼也可以通話(雖然事實(shí)上你應(yīng)該是知道的,你不會(huì)取消了來(lái)電顯示功能吧^^),但是,難道你是只接女朋友電話從來(lái)不打過(guò)去的牛人嗎?這個(gè)過(guò)程中的行為(成員函數(shù)):你小弟接
3、電話并轉(zhuǎn)接給你(isAccept());你自己的通話(handleEcho())(這個(gè)行為確實(shí)比較土,只會(huì)烏鴉學(xué)舌的echo,呵呵)。?UNIX中的一切事物都是文件(everythinginUnixisafile!) 這是UNIX的基本理念之一,也是一句很好的概括。比如,很多UNIX老鳥會(huì)舉出個(gè)例子來(lái),“你看,/dev/hdc是個(gè)文件,它實(shí)際上也是我的光盤……”UNIX中的文件可以是:網(wǎng)絡(luò)連接(networkconnection),輸入輸出(FIFO),管道(apipe),終端(terminal),硬盤上的實(shí)際文件,或者其它任何東東?! ?個(gè)已經(jīng)打開的fd,0:標(biāo)準(zhǔn)
4、輸入(STDIN_FILENO);1:標(biāo)準(zhǔn)輸出(STDOUT_FILENO);2:標(biāo)準(zhǔn)錯(cuò)誤(STDERR_FILENO)。(以上宏定義在中)一個(gè)最簡(jiǎn)單的使用fd的例子,就是使用中的函數(shù):write(1,"Hello,World!",20);,在標(biāo)準(zhǔn)輸出上顯示“Hello,World!”?! ile和fd并非一定是一一對(duì)應(yīng)的。當(dāng)一個(gè)file被多個(gè)程序調(diào)用的時(shí)候,會(huì)生成相互獨(dú)立的fd。這個(gè)概念可以類比于C++中的引用(eg:int&rTmp=tmp;)。socket與filedescriptor???????文件是應(yīng)用程序與系
5、統(tǒng)(包括特定硬件設(shè)備)之間的橋梁,而文件描述符就是應(yīng)用程序使用這個(gè)“橋梁”的接口。在需要的時(shí)候,應(yīng)用程序會(huì)向系統(tǒng)申請(qǐng)一個(gè)文件,然后將文件的描述符返回供程序使用。返回socket的文件通常被創(chuàng)建在/tmp或者/usr/tmp中。我們實(shí)際上不用關(guān)心這些文件,僅僅能夠利用返回的socket描述符就可以了。???????收件人:全體女生。地址:<一種地址描述方式>???????事實(shí)上,在socket的通用address描述結(jié)構(gòu)sockaddr中,正是用這樣的方式來(lái)進(jìn)行地址描述的:struct?sockaddr?{?????unsigned?short?sa_family;??
6、???char?sa_data[14];?};?sa_family可以認(rèn)為是socketaddressfamily的縮寫,也可能被簡(jiǎn)寫成AF(AddressFamily),他就好像我們例子中那個(gè)“收件人:全體女生”一樣,雖然事實(shí)上有很多AF的種類,但是我們這個(gè)教程中只用得上大名鼎鼎的internet家族AF_INET。另外的14字節(jié)是用來(lái)描述地址的。這是一種通用結(jié)構(gòu),事實(shí)上,當(dāng)我們指定sa_family=AF_INET之后,sa_data的形式也就被固定了下來(lái):最前端的2字節(jié)用于記錄16位的端口,緊接著的4字節(jié)用于記錄32位的IP地址,最后的8字節(jié)清空為零。這就是我們
7、實(shí)際在構(gòu)造sockaddr時(shí)候用到的結(jié)構(gòu)sockaddr_in(意指socketaddressinternet):struct?sockaddr_in?{?????unsigned?short?sin_family;?????unsigned?short?sin_port;?????struct?in_addr?sin_addr;?????char?sin_zero[8];?};?我想,sin_的意思,就是socket(address)internet吧,只不過(guò)把a(bǔ)ddress省略掉了。sin_addr被定義成了一個(gè)結(jié)構(gòu),這個(gè)結(jié)構(gòu)實(shí)際上就是:stru