linux網絡編程之 ─── socket概述

什麼是SOCKET

socket的英文原義是“孔”或“插座”。作爲4BDS UNIX的進程通信機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和端口,是一個通信鏈的句柄。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務。Socket正如其英文原意那樣,象一個多孔插座。一臺主機猶如佈滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務。socket也是一種文件描述符

socket實質上提供了進程通信的端 點。進程通信之前,雙方首先必須各自創建一個端點,否則是沒有辦法建立聯繫並相互通信的。正如打電話之前,雙方必須各自擁有一臺電話機一樣。在網間網內 部,每一個socket用一個半相關描述:
  (協議,本地地址,本地端口)

完整描述(全相關):

(協議,本地地址,本地端口號,遠地地址,遠地端口號)

Socket 接口是訪問 Internet 使用得最廣泛的方法。 如果你有一臺剛配好TCP/IP協議的主機,其IP地址是202.120.127.201, 此時在另一臺主機或同一臺主機上執行ftp 202.120.127.201,顯然無法建立連接。因"202.120.127.201" 這臺主機沒有運行FTP服務軟件。同樣, 在另一臺或同一臺主機上運行瀏覽軟件 如Netscape,輸入"http://202.120.127.201",也無法建立連接。現在,如果在這臺主機上運行一個FTP服務軟件(該軟件將 打開一個Socket, 並將其綁定到21端口),再在這臺主機上運行一個Web 服務軟件(該軟件將打開另一個Socket,並將其綁定到80端口)。這樣,在另一臺主機或同一臺主機上執行ftp 202.120.127.201,FTP客戶軟件將通過21端口來呼叫主機上由FTP 服務軟件提供的Socket,與其建立連接並對話。而在netscape中輸入"http://202.120.127.201"時,將通過80端口來呼 叫主機上由Web服務軟件提供的Socket,與其建 立連接並對話。 
  在Internet上有很多這樣的主機,這些主機一般運行了多個服務軟件,同時提供幾種服務。 每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務。Socket正如其英文原意那樣,象一個多孔插座。一臺主機猶如佈滿 各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務。

socket函數

頭文件

        #include<sys/types.h> /*數據類型定義*/

#include<sys/socket.h>/*提供socket函數及數據結構*/

函數原型

SOCKET socket(int af, int type, int protocol);  /*創建socket*/

函數參數

af 指明所使用的協議族:

PF_INET  //表示互聯網協議族(TCP/IP協議族)

AF_UNIX //Unix域套接字,用於本地進程間通信(AF_LOCAL)

AF_INET //互聯網IP協議 ==PF_INET()

type指定socket的類型:
SOCK_STREAM //建立TCP連接的流式套接字
SOCK_DGRAM  //建立無連接的UDP數據報套接字

SOCK_RAW
SOCK_RDM
SOCK_SEQPACKET 
SOCK_DCCP
SOCK_PACKET

protocol說明該套接字使用的特定協議,通常爲0

返回值:成功返回套接口,錯誤返回-1.

setsockopt()函數

作用:
setsockopt()函數用於任意類型、任意狀態套接口的設置選項值。儘管在不同協議層上存在選項,但本函數僅定義了最高的“套接口”層次上的選項。選項影響套接口的操作,諸如加急數據是否在普通數據流中接收,廣播數據是否可以從套接口發送等。  有兩種套接口的選項:一種是布爾型選項,允許或禁止一種特性;另一種是整形或結構選項。允許一個布爾型選項,則將optval指向非零整形數;禁止一個選項optval指向一個等於零的整形數。對於布爾型選項,optlen應等於sizeof(int);對其他選項,optval指向包含所需選項的整形數或結構,而optlen則爲整形數或結構的長度。SO_LINGER選項用於控制下述情況的行動:套接口上有排隊的待發送數據,且調用closesocket()已執行。參見closesocket()函數中關於SO_LINGER選項對closesocket()語義的影響。
頭文件:
#include <sys/types.h>
#include <sys/socket.h>
函數原型:int setsockopt( SOCKET s, int level, int optname, const char* optval, int optlen );
函數參數:
s(套接字): 指向一個打開的套接口描述字
level:(級別): 指定選項代碼的類型。
SOL_SOCKET: 基本套接口
IPPROTO_IP: IPv4套接口
IPPROTO_IPV6: IPv6套接口
IPPROTO_TCP: TCP套接口
optname(選項名): 選項名稱
optval(選項值): 是一個指向變量的指針 類型:整形,套接口結構, 其他結構類型:linger{}, timeval{ }
optlen(選項長度) :optval 的大小

optname指定控制的方式(選項的名稱),我們下面詳細解釋 

optval獲得或者是設置套接字選項.根據選項名稱的數據類型進行轉換 

選項名稱        說明                  數據類型


═══════════════════════════════════════════════════════
            SOL_SOCKET

───────────────────────────────────────────────────────
SO_BROADCAST      允許發送廣播數據            int
SO_DEBUG        允許調試                int
SO_DONTROUTE      不查找路由               int
SO_ERROR        獲得套接字錯誤             int
SO_KEEPALIVE      保持連接                int

SO_OOBINLINE      帶外數據放入正常數據流         int

SO_LINGER        延遲關閉連接              struct linger
SO_RCVBUF        接收緩衝區大小             int

SO_SNDBUF        發送緩衝區大小             int
SO_RCVLOWAT       接收緩衝區下限             int
SO_SNDLOWAT       發送緩衝區下限             int
SO_RCVTIMEO       接收超時                struct timeval
SO_SNDTIMEO       發送超時                struct timeval
SO_REUSERADDR      允許重用本地地址和端口         int
SO_TYPE         獲得套接字類型             int
SO_BSDCOMPAT      與BSD系統兼容              int
═══════════════════════════════════════════════════════
            IPPROTO_IP
───────────────────────────────────────────────────────
IP_HDRINCL         在數據包中包含IP首部          int
IP_OPTINOS         IP首部選項               int
IP_TOS             服務類型
IP_TTL              生存時間                int

以下IPV4選項用於組播
IP_ADD_MEMBERSHIP         加入到組播組中                          struct ip_mreq   
IP_ROP_MEMBERSHIP          從組播組中退出                         struct ip_mreq
IP_MULTICAST_IF               指定提交組播報文的接口               struct ip_mreq
IP_MULTICAST_TTL             指定提交組播報文的TTL                  u_char
IP_MULTICAST_LOOP           使組播報文環路有效或無效               u_char 
═══════════════════════════════════════════════════════
            IPPRO_TCP
───────────────────────────────────────────────────────
TCP_MAXSEG       TCP最大數據段的大小           int
TCP_NODELAY       不使用Nagle算法             int

TCP_CORK 控制了包的Nagle算法    int

TCP_QUICKACK  設置該選項以後,客戶在收到一個SYN/ACK包之後就 不再發送ACK包

TCP_DEFER_ACCEPT         
═══════════════════════════════════════════════════════
struct linger {
u_short l_onoff;
u_short l_linger;
};
struct ip_mreq {
struct in_addr imr_multiaddr; /* IP multicast address of group */
struct in_addr imr_interface; /* local IP address of interface */
}; 

返回值:  
成功執行時,返回0。失敗返回-1,

errno被設爲以下的某個值  

EBADF:sock不是有效的文件描述詞
EFAULT:optval指向的內存並非有效的進程空間
EINVAL:在調用setsockopt()時,optlen無效
ENOPROTOOPT:指定的協議層不能識別選項
ENOTSOCK:sock描述的不是套接字

getsocket()函數

作用:getsockopt()函數用於獲取任意類型、任意狀態套接口的選項當前值,並把結果存入optval。在不同協議層上存在選項,但往往是在最高的“套接口”層次上,設置選項影響套接口的操作,諸如操作的阻塞與否、包的選徑方式、帶外數據的傳送等。
  被選中選項的值放在optval緩衝區中。optlen所指向的整形數在初始時包含緩衝區的長度,在調用返回時被置爲實際值的長度。對SO_LINGER選項而言,相當於linger結構的大小,對其他選項來說,是一個整形數的大小。

頭文件:

#include <sys/types.h>
#include <sys/socket.h>

函數原型:int getsocket(int sock, int level, int optname, void *optval, socklen_t *optlen);

參數:  
sock:將要獲取選項的套接字。
level:選項所在的協議層。
optname:需要訪問的選項名。
optval:指向返回選項值的緩衝。
optlen:作爲入口參數時,選項值的最大長度。作爲出口參數時,選項值的實際長度。

返回值:成功返回0,錯誤返回-1.

closesocket()函數
作用:關閉一個套接口

頭文件:

#include <sys/types.h>
#include <sys/socket.h>

函數原型:int closesocket(int sock);

參數:  
sock:將要被關閉的套接字。








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