read,write函數深入理解
1,服務端的write函數,可以指定發送數據的長度(第三個參數length)
write(connfd, &buff[i], length);
2,客戶端的read函數,可以指定收取數據的長度(第三個參數length)
read(sockfd, recvline, length)
問題來了,假設要發送的數據的總長度為20,服務端調用write函數時,是放在循環里調用,每次發送的長度設置為1,所以全部發完,需要循環20次,也就是調用了20次的write函數。然后,客戶端的read函數調用如下面所示,計數器cnt的值為多少???
int cnt = 0;
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
cnt += 1;
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
printf("count:%d\n", cnt);
根據運行服務端的程序的機器和運行客戶端程序的機器不同,而不同。
- 如果客戶程序和服務器程序運行在一個主機上的話,計數器通常是1。
- 如果客戶運行在Solaris上,而服務器運行在BSD上,那么計數器通常是2。第一個字符被分成1組,剩余的19個字符分為1組,所以計數器是2。
- 如果客戶運行在BSD上,服務器運行在Solaris上,那么計數器是20。每個字符被分成1組,所以計數器是20。
想強調的是:針對不同的環境,我們的程序必須作好為字節流讀入這些數據的准備,直到遇上數據流的末尾
c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854