之前我們一直使用的read,write函式以及它們的變體recv, send等函式執行i/o,這些函式都是要使用描述符的,通常這些函式都作為unix核心中的系統呼叫實現。
除了以上說的系統呼叫,我們也可以使用標準i/o函式庫(standard i/o libary),這個函式庫由 ansi c 標準進行規範,不過使用標準i/o函式需要建立乙個標準 i/o 流,我們可以使用fdopen函式來完成,與 fdopen 函式功能相反的函式是 fileno,該函式是從標準 i/o 流建立乙個檔案描述符。
這兩個函式原型如下:
#include file *fdopen(int fd, const char *mode);
int fileno(file *stream);
fdopen函式的fd引數表示檔案描述符,mode則是檔案的讀寫許可權,例如:」w」表示寫許可權,「r」表示讀許可權。
fileno函式的stream引數表示需要傳入乙個檔案流形式的指標。
使用標準i/o函式庫需要考慮以下幾點:
1. 當我們想要在標準i/o中呼叫select時,由於select只能用於描述符,因此需要獲取標準i/o流的描述符,當然我們可以使用fileno函式來完成。使用標準i/o改寫tcp伺服器,**如下:2. tcp套接字和udp套接字是全雙工的,標準i/o流也可以是全雙工的,但是為了避免標準i/o緩衝區的問題,解決辦法是給套接字建立兩個標誌i/o流,乙個用於讀,另乙個用於寫。
#include #include #include #include #include #include #include #include #define serv_port 10001
#define serv_ip "127.0.0.1"
int main(void)
//處理完資料,回寫給客戶端
if(fputs(buf , fpout) == eof)
//重新整理標準i/o
fflush(fpout);
} //關閉連線
close(sfd);
close(cfd);
return 0;
}
此時服務端並沒有重新整理標準i/o,在客戶端輸入一些資料,執行結果如下:
可以看到,在客戶端處連續輸入幾次資料後,卻沒有收到任何服務端的回應。
此時開啟服務端重新整理標準i/o,然後在客戶端輸入資料:
從上面的結果我們知道,開啟服務端重新整理標準i/o後,客戶端才會收到服務端的回應,原因在於標準i/o的緩衝問題,也就是說服務端呼叫fputs寫入的回射實際上是寫入到了標準i/o的緩衝區,而不是套接字的緩衝區,因為標準i/o類呼叫都有乙個使用者緩衝區,當呼叫標準i/o函式時還要把資料從使用者緩衝區拷貝到核心緩衝區(即套接字的緩衝區),但問題在於此時標準i/o的緩衝區沒有滿。
只有當標準i/o的緩衝區滿了之後,才會把資料拷貝到套接字描述符的緩衝區,最終回射給客戶端,而fflush函式則正好是幹這件事情的。通常標準i/o有三大類緩衝區,關於標準i/o的快取具體可參考:2-c標準的i/o快取和file結構體 , 5-檔案i/o—read/write函式,這裡就不詳細介紹了。
套接字和標準I O
良好的移植性 利用標準i o函式的緩衝可以提高效能 傳輸資料越多,效能提公升越大,但是在多執行緒中似乎優點問題 server.cpp include include include include include include define max buff size 1024 void hand...
網路程式設計 15 套接字和標準IO
1。標準io函式具有良好的移植性,這些函式都是按照ansi c標準定義的 2。標準io函式可以利用緩衝提高效能 建立套接字時作業系統會準備io緩衝,此緩衝在執行tcp協議時發揮著重要的作用。若使用標準io函式,將得到額外的另一緩衝的支援 可以看到,使用標準io函式傳輸資料時,經過兩個緩衝。例如通過f...
《網路程式設計》 第15章 套接字和標準 I O
系統讀寫函式 read write 標準i o函式 fgets fputs 系統讀寫函式不帶緩衝區,而標準i o函式自帶緩衝區。在讀寫比較大的檔案的時候,標準i o函式更快。辨 系統函式 讀寫的輸入是 檔案描述符 標準i o函式 讀寫的輸入是 file 結構體指標。include int fgetc...