【文章內(nèi)容簡介】
many function. 插口結(jié)構(gòu) ClientServer執(zhí)行模式 ClientServer端執(zhí)行模式 Socket bind listen accept Send/recv(循環(huán) ) close Socket connect Send/recv(循環(huán) ) close 通信階段 連接建立階段 關(guān)閉階段 準(zhǔn)備階段 Server Client 注意:上面這些 Socket的意思與指 IP地址和TCP端口號的組合的 Socket不同 Procedures that Implement The Socket API The Socket Procedure. descriptor = socket(protofamily, type,protocol) Return a socket descriptor if successful。 1 if error. The Socket Procedure: The socket procedure creates a socket and returns an integer descriptor. It sets values for only the first three fields of the socket structure. The other fields are set by the other functions or by the operating system. Argument Protofamily: 1: AFINET4 IPv4協(xié)議 2: AFINET6 IPv6協(xié)議 3: AFLOCAL Unix域協(xié)議 4: AFROUTE 路由插口 ?? Argument type specifies the type of munication the socket will use. TCP/IP的 socket提供下列三種類型插口。 1. SOCK_STREAM(字節(jié)流插口) 提供了一個面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復(fù)地發(fā)送,且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長度限制。文件傳送協(xié)議( FTP)即使用流式插口。 2. SOCK_DGRAM (數(shù)據(jù)報(bào)插口) 提供了一個無連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無錯保證, 數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。網(wǎng)絡(luò)文件系統(tǒng)( NFS)使用數(shù)據(jù)報(bào)式插口。 3. SOCK_RAW (原始插口) 該接口允許對較低層協(xié)議,如 IP、 ICMP直接訪問。常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn)或訪問現(xiàn)有服務(wù)中配置的新設(shè)備。 type AF_INET AF_INET6 SOCK_STREAM TCP TCP SOCK_DGRAM UDP UDP SOCK_RAW IPv4 IPv6 Family 與 type 的組合 Argument protocol 一般情況將其設(shè)置為 0,除非用在原始插口上。 Protocol的常量在頭文件 i/中定義,常量名以 IPPROTO_開頭。例如: IPPROTO_IGMP IPPROTO_IP IPPROTO_ICMP The Bind Procedure The bind function binds a socket to a local socket address by adding the local socket address to an already created socket. 其調(diào)用格式如下: bind( socket, localaddr, addrlen) Returns 0 if successful。 1 if error. 當(dāng)一個 socket用 socket()創(chuàng)建后,存在一個名字空間 (地址族 ),但它沒有被命名。bind()將 socket地址(包括本地主機(jī)地址和本地端口地址)與所創(chuàng)建的 socket號聯(lián)系起來,即將名字賦予 socket,以指定本地半相關(guān)。 對于服務(wù)器而言,需要將插口綁定到一個已知的端口上,因?yàn)橹挥羞@樣,客戶端才知道該往何處發(fā)起連接。為此,需要調(diào)用bind()函數(shù),并設(shè)置其參數(shù)。 設(shè)置插口地址結(jié)構(gòu)的幾種常見方式 IP地址 端口 說明 通配地址 0 內(nèi)核自動選擇 IP地址和端口 通配地址 非 0 內(nèi)核自動選擇 IP地址,進(jìn)程指定端口 本地 IP地址 0 進(jìn)程指定 IP地址,內(nèi)核自動選擇端口 本地 IP地址 非 0 IP地址和端口均由應(yīng)用進(jìn)程指定 “通配地址” 通常由常量 INADDR_ANY指定 地址在建立 socket通信過程中起著重要作用,作為一個網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)者對socket地址結(jié)構(gòu)必須有明確認(rèn)識。 例如, UNIX BSD有一組描述 socket地址的數(shù)據(jù)結(jié)構(gòu) . T C P / I P協(xié)議使用 s o c k a d d r _ i n來定義地址 struct sockaddr_in { u_char sin_len; /*地址總長 */ u_char sin_family; /*地址族 AF_INET*/ u_short sin_port; /*協(xié)議端口號 */