UNIX網絡編程第三版(卷1)讀書筆記以及習題-章節1

1. 幾個關鍵點:

  • client使用read讀取socket返回的數據的時候,總是使用一個循環包裹,最主要的原因就是tcp/ip協議傳輸的時候,數據會根據實際情況進行分節,因此只有循環才能保證讀出全部的數據。
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
    recvline[n] = 0;    /* null terminate */
    if (fputs(recvline, stdout) == EOF)
        err_sys("fputs error");
}
  • 網絡傳輸的7層模型:應用層-表示層-會話層-傳輸層(TCP/UDP協議)-網絡層(IPv4/IPv6協議)-數據鏈路層-物理層,上三層都可以統稱應用層。

2. 章節末習題:

  • 第三題:修改client socket(AF_INET, SOCK_STREAM, 0) AF_INET成9999.

    • 結果:報socket error: Address family not supported by protocol family
    • 經查詢:AF_INET本身代表了protocol family的一個特殊標記值,如果修改成其他值,相當於一個新的protocol family,那麼之後傳入的address family當然不會支持了。
  • 第四題:client增加一個計數器並打印。

int counter = 0;

while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
    counter++;
    recvline[n] = 0;    /* null terminate */
    if (fputs(recvline, stdout) == EOF)
        err_sys("fputs error");
}

printf("%d\n",counter);
  • 第五題:修改server端代碼,將原本完整的內容,單字節發送,並查看client端實際執行的read次數。
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));

for (int i = 0; i < strlen(buff); ++i) {
    Write(connfd, &(buff[i]), 1);
}

Close(connfd);

實際執行client端,每次執行read的counter都在變化。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章