linux 網絡編程總結(之網絡編程函數總結)

       這周學習了linux網絡編程相關的知識,如今將其總結以下:linux


       在linux系統中已經將TCP/IP協議相關的東西都封裝好了,因此在入門學習網絡編程的時候並無學習研究太多TCP/IP協議的東西,而是學習那些已經將協議封裝好的函數和API。編程


       在linux網絡編程中基本幾個函數以下:緩存


         第一個函數:套接字建立函數
服務器

                    

        該函數功能是建立一個套接字,各參數含義及函數用法以下網絡

         參數_domain表示建立的套接字使用的協議族,其主要取值有:dom

                 AF_UNIX:建立一個只在本機內進行通訊的套接字socket

                 AF_INET:使用IPv4 TCP/IP協議函數

                 AF_INET6:使用IPv6 TCP/IP協議學習

         參數_type表示套接字的類型,能夠有以下取值:spa

                 SOCK_STREAM:建立一個TCP套接字

                 SOCK_DGRAM:建立UDP套接字

                 SOCK_RAM:建立一個原始套接字

           參數_protocol一般設置爲0,表示經過參數_domain制定的協議族和參數_type指定的套接字類型來肯定使用的協議。當建立原始套接字時,系統沒法惟一地肯定協議,此時就須要使用該參數指定所使用的協議。

       函數執行成功返回新建立的套接字,失敗返回-1,錯誤代碼存入errno中。


       第二個函數:創建鏈接函數

         

       該函數的功能是在指定的套接字上建立一個鏈接。各參數含義及用法以下

       參數__fd是由socket()函數建立的一個套接字,若是該套接字類型是SOCK_STREAM,則connect函數用於向服務器發出鏈接請求。服務器的IP地址和端口號由參數__addr參數指定,上圖中__addr所對應的數據類型是const struct socketaddr *。若是套接字類型是SOCK_DGRAM則調用connect函數並不真正創建鏈接而只是告訴內核與該套接字進行通訊的目的地址(的第二個參數指定),只有該目標地址發來數據時纔會被該socket接收。對於SOCK_DGRAM的好處在於沒必要每次發送數據時都指定目的地址。__len參數表示第二個地址參數的大小。

       該函數在使用時須要注意:若是是TCP常鏈接選項的話只可以調用一次connect函數創建鏈接,而對於無鏈接的UDP來講能夠屢次調用該函數來改變發送數據的目標地址。

    

      第三個函數:綁定端口函數

   

       該函數是將一個端口綁定在某個套接字上,這個函數經常使用在服務器端。其中__fd表示要綁定的套接字描述符,__addr表示要綁定的IP,__len表示要綁定的IP長度,通常用sizeof計算。


           第四個函數:監聽函數

  
        該函數是將一個套接字轉化爲監聽套接字,經常使用於服務器端監聽來自客戶端的鏈接請求。第一個參數__fd表示監聽套接字描述符,第二個參數表示最大監聽的個數。

       第五個函數:接受鏈接函數

       這個函數的功能是接收來自監聽套接字上的請求,__fd是一個監聽套接字,__addr用來保存發起鏈接的主機的端口號和IP,與上兩個函數中的__addr類型相同,__addr_len是__addr所指向的長度,通常使用sizeof計算達到。

       該函數返回一個套接字,返回的套接字就是和客戶端創建鏈接的客戶端。


      第六個函數:發送數據函數

      創建鏈接的目的就是發送數據,linux中發送數據提供了兩個函數,一個用於使用TCP來發送數據,一個使用UDP發送數據,這裏總結TCP發送數據的函數,由於UDP發送數據的函數和TCP的int sendto(int __fd, const void *__buf, size_t  __n, int __flags,  __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)只是多了發送的目標ID和目標ID的長度。

      該函數是使用TCP發送數據,__fd表示創建起鏈接的套接字(accept函數返回的套接字而非listen函數中的套接字),

__buf表示要發送的數據緩存區地址,__n表示發送數據的長度,__flags表示控制選項,通常取0或者如下值:

        MSG_OOB:在指定套接字上發送帶外數據(所謂帶外數據就是指鏈接雙方中的一方發生重要的事情,想要迅速通知對方,這種通知在已排隊等待的任何「普通」數據以前發送。帶外數據的發送優先級更高,帶外數據是映射進現有鏈接中而不須要從新鏈接)

        MSG_DONTROUTE:經過最直接路徑發送數據,而忽略下層協議的路由設置。


        第七個函數:接收數據

        linux中提供了TCP接收函數和既能接收TCP又能接收UDP數據的接收函數。

        二者都能接收的函數爲:


        該函數的__fd參數表示鏈接套接字,__restrict __buf表示接收緩存區,__n表示接收緩存區的大小,__flags通常爲0其他取值以下:

        MSG_OOB:在指定套接字上發送帶外數據

        MSG_PEEK:之查看數據而不讀出數據

        MSG_WAITALL:只在接收數據緩存區滿的時候才返回。

        若是該函數的__addr非空則表示不是面向鏈接的,__addr_len在調用前表示__addr的長度,調用後將表示__addr的實際大小。

        只能接收TCP的函數爲:

        extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);該函數只能用於常鏈接,函數的參數和上邊那個函數差很少,少了最後兩個參數。


            打個比方來理解這些函數的工做吧,服務器就至關於公司的老闆(boss),客戶端至關於公司的員工,bind函數至關於給老闆分配一個辦公室,listen函數表示老闆在辦公室坐在窗邊喝着茶等着員工來找他辦事,connect函數表示員工主動去找老闆談加工資的事情,accept函數至關於老闆將談工資這個事情分配給了管工資的小老闆,而後員工(客戶端套接字描述符)和小老闆(accept函數返回的套接字)開始了談工資的工做,而接收函數和發送函數一個能夠當作說話一個能夠當作聽話。

相關文章
相關標籤/搜索