網絡編程基礎

1.服務器進程如果需要綁定保留端口號,如80 for HTTP,必須以超級用戶運行,否則bind將返回錯誤:PermissionDenied;
2.每個子進程只有一個父進程,且可以使用函數getppid獲取父進程的進程ID;
3.每個父進程可以有多個子進程,且沒有函數可以直接獲取子進程的進程ID,但是可以通過記錄fork返回值的方式獲取,如保存在一個數組/鏈表中;
4.併發服務器的一般實現:
 
  1)調用accept獲取客戶連接之後調用fork派生子進程,此時父進程中獲取的客戶套接字、地址結構等均爲子進程所共享
    2)子進程使用這個共享的套接字進行數據讀寫
   3)父進程則直接close這個套接字
5.fork的兩個典型用法:
   1)創建自身的副本,這樣子進程就可以在這些副本的基礎上繼續工作,這是網絡服務器的典型用法
   2)調用fork之後接着調用exec開啓其他程序,這是shell程序的典型用法,如執行ls命令,shell會首先fork一個子進程,然後在子進程中立即調用exec開啓ls程序
6.網絡應用程序調用close只是將套接字的引用計數減少1,這並不會直接導致內核的TCP層發生4握手的連接終止過程,除非減1後套接字引用變成0
7.與此相反,在一個套接字上面調用shutdown函數則會立即導致TCP連接終止的發生,即開始4次握手協議
8.端口號
    1)衆所周知端口號:0-- 1023,unix中的服務器進程必須以超級用戶特權運行,否則bind將失敗返回
    2)註冊端口號:1024-- 49151,向IANA註冊的端口號
   3)臨時端口號:49152 -- 65535,一般用於客戶進程分配臨時端口號
9.一個輸入操作通常分爲兩個階段:
   1)等待內核準備好數據
   2)從內核向進程複製數據
10.unix環境的五種I/O模型
   1)阻塞式I/O:進程阻塞於I/O直到內核與進程之間的數據複製完成
   2)非阻塞式I/O:進程從內核讀數據時,如果內核此時沒有準備好數據,那麼內核將會向進程返回EWOULDBLOCK錯誤,由進程決定下一步的處理方式,例如再次從內核讀數據直到內核準備好數據
   3)I/O複用(select和poll函數):進程阻塞於select或poll調用,直到內核準備好數據,函數返回,進程接着調用讀寫函數進行數據讀寫,相比於阻塞式I/O,I/O複用的優勢在於,它可以同時等待多個文件描述符,直到其中某個變得可讀寫
   4)信號驅動式I/O(SIGIO):在SIGIO的信號處理程序中進行數據的讀寫或者在信號到達時通知主程序進行數據讀寫
   5)異步I/O(POSIX的aio_系列函數):進程調用異步I/O函數並立即返回,由內核進行異步數據讀寫,在讀寫完成時給進程發送通知(通常是在aio_函數中指定的信號),相比於信號驅動式I/O,異步I/O是在內核已經將數據複製到進程緩衝區時才向進程發送信號(前者是在內核準備好數據時發送)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章