基於文字行協議

2021-06-23 03:44:23 字數 1263 閱讀 5556



很多網際網路上的協議例如http、sip、smtp、ftp的控制連線協議都是基於文字行的。所謂基於文字行,指的是資訊以文字傳遞,乙個資訊單元傳遞完畢後要傳送換行。比如對於http的get請求來說,get /index.html http/1.0

是一行,接下去每個頭部資訊各佔一行。乙個空行表示整個請求結束。而tcp是基於流的,使用read/recv和write/send一次讀入或寫入的位元組可能比要求的少,並且資訊單元也不是按換行分割的。事實上流是不可分割的。對方呼叫send一次傳送200k,也許接收方第一次呼叫recv只能收到 50k,後續還要呼叫多次recv才能收完。並且如果需要在tcp上應用http這樣的協議,需要自己檢測換行。將資料接收下來以後,換行可能在任何地方出現而不只是在資料的末尾出現。

如果不苛求十全十美,有乙個簡單方法可以解決這個問題,那就是將socket與c標準庫里的標準輸入輸出連線起來。

具體的說,就是使用下面這個呼叫。

file *fdopen(int fildes, const char *mode);

假設sockfd是用socket()建立的乙個socket描述符。呼叫

fpin=fdopen(sockfd,"r");

fpout=fdopen(dup(sockfd),"w");

可以建立兩個file指標fpin和fpout。

呼叫setlinebuf(fpin);

setlinebuf(fpout);

可以將緩衝模式設定成行緩衝。

現在在這兩個file指標上就可以呼叫fgets、fputs等函式了。在遇到換行符號時,fputs會將緩衝區內的資料實際傳送到網路上,而對於 fgets,會一直累計接收資料並放在緩衝區中,直到遇到換行才返回。當然,需要給fgets指定乙個行長度的上限,以免緩衝區溢位。與gets、 puts不同,fgets、fputs會保留換行符。另外,呼叫fflush可以強制將緩衝區的資料寫到網路上。

在這樣的基礎上去實現基於行的文字協議就非常方便了。

全是標準庫的基礎知識,沒什麼新鮮的,但是用標準庫的i/o函式處理socket,還是很方便的。我也是最近想寫乙個http+https的**伺服器程式,才發現有這麼乙個思路可以用。網上沒有特別權威的資料,在比較權威(個人認為)《unix網路程式設計》裡只是用了乙個小節介紹,並不詳細。在應用層,基於文字的協議是一種風格和趨勢,http、smtp、sip、soap等等全都是文字協議,文字協議天生就有很多優點,所以使用標準i/o庫來處理就可以大大的方便網路程式的編寫和新文字協議的設計

限制文字行數

1行 white space nowrap overflow hidden text overflow ellipsis ps 一定要指定容器的寬度,不然的話是沒有用的。多行 方法一 只支援 webkit核心,不支援火狐 方法二 不管怎樣,省略號都會出現,建議配合js,只有超出高度時,才顯示 aft...

CSS 文字行(總結筆記)

1 什麼是行高?行高指文字基線間的垂直距離,行高在數值上等於字型大小 行距。行高是可繼承的line height 是可以繼承的。父元素不同的行高單位影響子元素的繼承 父元素的行高為 24px 時,子元素直接繼承此固定的行高 父元素的行高為 150 或 1.5em 時,會根據父元素的字型大小先計算出行...

Linux 文字行列轉換

使用awk進行行列轉換 假設有乙個檔案 test 包含的資料遵循以下格式 同一行資料,單詞之間為1個空格 每一行都有同樣多的資料,個數相同 處理命令 awk endprint str test 簡單說明 nr number of record 當前處理的行是第幾行 因為awk是流處理工具,一行一行處...