什麼是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()
SOCK_RAW
SOCK_RDM
SOCK_SEQPACKET
SOCK_DCCP
SOCK_PACKET
protocol說明該套接字使用的特定協議,通常爲0
返回值:成功返回套接口,錯誤返回-1.
setsockopt()函數
#include <sys/socket.h>
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包
u_short l_onoff;
u_short l_linger;
};
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:作爲入口參數時,選項值的最大長度。作爲出口參數時,選項值的實際長度。
頭文件:
#include <sys/types.h>
#include <sys/socket.h>
函數原型:int closesocket(int sock);
參數:sock:將要被關閉的套接字。