<TCP/IP網(wǎng)絡(luò)編程> Chap.5 基于TCP的服務(wù)器端/客戶端(2)

已知字符串長度情況下完善回聲客戶端

# gcc echo_client2.c -o eclient2
# ./eclient2 127.0.0.1 9190
Connected
Input message (Q to quit): orange
Message from server: orange
Input message (Q to quit): hhhhhhhhhhhhhhhhhhhhhhhhhhhh
Message from server: hhhhhhhhhhhhhhhhhhhhhhhhhhhh
Input message (Q to quit): q

服務(wù)端同上一章春塌。


定義應(yīng)用層協(xié)議

原書中有些bug,服務(wù)端接收到的操作數(shù)個(gè)數(shù)沒有轉(zhuǎn)換成int寺旺。經(jīng)fix后代碼見附錄男窟,運(yùn)行結(jié)果如下:

# ./opserver 9190
Connected client 1 
Connected client 2 
Connected client 3 
# ./opclient 127.0.0.1 9190
Connected
Input operand count: 3
Input operand: 1
Input operand: 5
Input operand: 9
Input operator: +
Operation result: 15
# ./opclient 127.0.0.1 9190
Connected
Input operand count: 4
Input operand: 16
Input operand: 8
Input operand: 4
Input operand: 2
Input operator: -
Operation result: 2
# ./opclient 127.0.0.1 9190
Connected
Input operand count: 2
Input operand: 5
Input operand: 7
Input operator: *
Operation result: 35


TCP原理

I/O緩沖特性:

  • I/O緩沖在每個(gè)TCP套接字中單獨(dú)存在。
  • I/O緩沖在創(chuàng)建套接字時(shí)自動(dòng)生成蒿囤。
  • 即使關(guān)閉套接字也會(huì)繼續(xù)傳遞輸出緩沖區(qū)中的遺留數(shù)據(jù)客们。
  • 關(guān)閉套接字將丟失輸入緩沖區(qū)中的遺留數(shù)據(jù)。


習(xí)題

  1. 請(qǐng)說明TCP套接字連接設(shè)置的三次握手過程材诽。尤其是3次數(shù)據(jù)交換過程每次收發(fā)的數(shù)據(jù)內(nèi)容底挫。
    1)A向B發(fā)起連接,發(fā)送SYN包(SYN=1脸侥,seg=X)
    2)B回復(fù)SYN_ACK包(SYN=1建邓,ACK=1,seg=Y睁枕,ack number=X+1)
    3)最后A向B傳輸消息(ACK=1官边,seg=X+1,ack number=Y+1)
    從步驟3)開始A就可以攜帶應(yīng)用層數(shù)據(jù)了外遇。
  2. TCP是可靠的數(shù)據(jù)傳輸協(xié)議注簿,但在通過網(wǎng)絡(luò)通信的過程中可能丟失數(shù)據(jù)。請(qǐng)通過ACK和SEQ說明TCP通過何種機(jī)制保證丟失數(shù)據(jù)的可靠傳輸跳仿。
    SEQ是當(dāng)前數(shù)據(jù)起始字節(jié)的序號(hào)诡渴,加入收到對(duì)方返回的ACK剛好是SEQ+數(shù)據(jù)大小(以字節(jié)為單位)菲语,則代表正確送達(dá)妄辩,可以繼續(xù)發(fā)送后續(xù)數(shù)據(jù)包惑灵。反之,在計(jì)時(shí)器超時(shí)后進(jìn)行重傳恩袱。
  3. TCP套接字中調(diào)用write和read函數(shù)時(shí)數(shù)據(jù)如何移動(dòng)泣棋?結(jié)合I/O緩沖進(jìn)行說明。
    write函數(shù)調(diào)用瞬間畔塔,數(shù)據(jù)將移至輸出緩沖;read函數(shù)調(diào)用瞬間鸯屿,從輸入緩沖讀取數(shù)據(jù)澈吨。
  4. 對(duì)方主機(jī)的輸入緩沖剩余50字節(jié)空間時(shí),若本方主機(jī)通過write函數(shù)請(qǐng)求傳輸70 字節(jié)寄摆,請(qǐng)問TCP如何處理這種情況谅辣?
    將70字節(jié)數(shù)據(jù)放入輸出緩沖,然后發(fā)送50字節(jié)到對(duì)方主機(jī)婶恼,待對(duì)方主機(jī)的輸入緩沖又有剩余時(shí)再發(fā)送后面的字節(jié)桑阶。
  5. 第2章示例tcp_server.c和tcp_client.c中,客戶端接收服務(wù)器端傳輸?shù)淖址蟊阃顺觥勾邦,F(xiàn)更改程序蚣录,使服務(wù)器端和客戶端各傳遞1次字符串【炱考慮到使用TCP協(xié)議萎河,所以傳遞字符串前先以4字節(jié)整數(shù)型方式傳遞字符串長度。連接時(shí)服務(wù)器端和客戶端數(shù)據(jù)傳輸格式如下蕉饼。另外虐杯,不限制字符串傳輸順序及種類,但須進(jìn)行3次數(shù)據(jù)交換昧港。
    代碼見附錄擎椰。
    0   0   0   6   H   e   l   l   o   ?
   |-- 字符串長度 --|------ 字符串?dāng)?shù)據(jù) ------|
# gcc tri_server.c -o tserver
# ./tserver 9191
Connected client 1 
Message from client: Hello?
Input message: Hi!
Message from client: This is Xiao.
Input message: I'm Yao.
Message from client: Nice to meet you!
Input message: Me, too.
# gcc tri_client.c -o tclient
# ./tclient 127.0.0.1 9191
Connected
Input message: Hello?
Message from server: Hi!
Input message: This is Xiao.
Message from server: I'm Yao.
Input message: Nice to meet you!   
Message from server: Me, too.
  1. 創(chuàng)建收發(fā)文件的服務(wù)器端/客戶端,實(shí)現(xiàn)順序如下创肥。
    a. 客戶端接受用戶輸入的傳輸文件名达舒。
    b. 客戶端請(qǐng)求服務(wù)器端傳輸該文件名所指文件。
    c. 如果指定文件存在瓤的,服務(wù)器端就將其發(fā)送給客戶端休弃;反之,則斷開連接圈膏。
    代碼見附錄塔猾。
# gcc file_server.c -o fserver
# ./fserver 9190
Connected client
# gcc file_client.c -o fclient
# ./fclient 127.0.0.1 9190
Connected
Input file name: exercise6


我的問題

  1. 把int存到char型數(shù)組中后發(fā)生了什么?
  2. fgetc(stdin)的作用稽坤?
    刪除stdin中的"\n"字符丈甸,因?yàn)榍懊孀x取操作數(shù)的時(shí)候糯俗,最后有一個(gè)回車,他不能被當(dāng)做運(yùn)算符讀進(jìn)來睦擂。而前面讀操作數(shù)之前為什么不fgetc一下呢得湘?因?yàn)樽x取的是%d,它會(huì)自動(dòng)找到整數(shù)來讀取顿仇,忽略先導(dǎo)的空白符(指空格符淘正、制表符、回車符)臼闻。但當(dāng)讀取的是%c的時(shí)候鸿吆,scanf把緩沖區(qū)的第一個(gè)字符返回回去,不管是什么述呐,所以如果不fgetc就會(huì)讀取出“\n”惩淳。
  3. seq與ack number的關(guān)系?
    書中的seq與ack number有錯(cuò)誤乓搬。以圖5-4為例進(jìn)行改正思犁。
A                                           B
|    --- seq 1200 (100 bytes data) -->      |
|         <-- ack number 1300 ---           |
|    --- seq 1300 (100 bytes data) -->      |
|         <-- ack number 1400 ---           |
  1. C語言如果不初始化局部整型變量,里面的值是什么进肯?
    與編譯器有關(guān)激蹲。對(duì)GCC來說,局部整型變量里的值是隨機(jī)的坷澡。所以初始化是必需的托呕。
  2. 為什么要用fgets讀取用戶輸入,而不是scanf频敛?
    scanf遇空白符(空格项郊、回車、制表符)即終止讀取斟赚,無法一次性讀取完整的一個(gè)句子着降。而fgets每次讀取一行。


附錄

[1] 關(guān)于int整數(shù)轉(zhuǎn)換存儲(chǔ)到字符數(shù)組
[2] scanf用法及scanf中有\(zhòng)n的問題
[3] TCP連接建立的三次握手過程可以攜帶數(shù)據(jù)嗎拗军?
[4] Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末任洞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子发侵,更是在濱河造成了極大的恐慌交掏,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刃鳄,死亡現(xiàn)場離奇詭異盅弛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門挪鹏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來见秽,“玉大人,你說我怎么就攤上這事讨盒〗馊。” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵返顺,是天一觀的道長禀苦。 經(jīng)常有香客問我,道長创南,這世上最難降的妖魔是什么伦忠? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮稿辙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘气忠。我一直安慰自己邻储,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布旧噪。 她就那樣靜靜地躺著吨娜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淘钟。 梳的紋絲不亂的頭發(fā)上宦赠,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音米母,去河邊找鬼勾扭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铁瞒,可吹牛的內(nèi)容都是我干的妙色。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼慧耍,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼身辨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芍碧,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤煌珊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泌豆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體定庵,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洗贰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片找岖。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敛滋,靈堂內(nèi)的尸體忽然破棺而出许布,到底是詐尸還是另有隱情,我是刑警寧澤绎晃,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布蜜唾,位于F島的核電站,受9級(jí)特大地震影響庶艾,放射性物質(zhì)發(fā)生泄漏袁余。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一咱揍、第九天 我趴在偏房一處隱蔽的房頂上張望颖榜。 院中可真熱鬧,春花似錦煤裙、人聲如沸掩完。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽且蓬。三九已至,卻和暖如春题翰,著一層夾襖步出監(jiān)牢的瞬間恶阴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工豹障, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冯事,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓沼填,卻偏偏與公主長得像桅咆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坞笙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345