19 高階I O函式 套接字和標準I O

2021-09-07 04:31:57 字數 1728 閱讀 2657

之前我們一直使用的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函式來完成。

2. tcp套接字和udp套接字是全雙工的,標準i/o流也可以是全雙工的,但是為了避免標準i/o緩衝區的問題,解決辦法是給套接字建立兩個標誌i/o流,乙個用於讀,另乙個用於寫。

使用標準i/o改寫tcp伺服器,**如下:

#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...