一、socket函數
1、頭文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
2、函數原型:
int socket(int domain, int type, int protocol);
socket函數類似於open,用來打開一個網絡連接,如果成功則返回一個網絡文件描述符(int類型),之后我們操作這個網絡連接都通過這個網絡文件描述符。
dimain:域,網絡域,網絡地址范圍(IPV4或IPV6等),也就是協議簇
type:指定套接字類型:SOCK_STREAM(TCP網絡)、SOCK_DGRAM(UDP)、SOCK_SEQPACKET
protocol:指定協議,如果指定0,表示使用默認的協議
3、函數形參:
3.1、domain:(域)
AF_INET ip
AF_INET6 ipv6
AF_PACKET packet 低級數據包接口
PF_PACKET 不懂,待了解
PF_INET 待了解(AF開頭的表示地址族,PF開頭的表示協議族,協議族包含多個地址族,但是當前這種還從未實現,而在<sys/socket.h>中PF的值總是與AF的值相等的)
3.2、type:(套接字類型):
SOCK_RAW 原始套接字 ——>使用原始套接字時候調用,原始套接字也就是鏈路層協議
SOCK_STREAM 字節流套接字 ——>提供順序,可靠,雙向,基於連接的字節流。 可以支持帶外數據傳輸機制。例如:TCP協議、FTP協議
SOCK_DGRAM 數據報套接字 ——>支持數據報(無連接,不可靠的固定最大長度的消息)例如:UDP協議
SOCK_SEQPACKET 有序分組套接字 ——>為固定最大長度的數據報提供有序,可靠,雙向連接的數據傳輸路徑; 消費者需要利用每個輸入系統調用讀取整個分組
3.3、protocol(協議):
IPPROTO_IP IP傳輸協議
IPPROTO_TCP TCP傳輸協議
IPPROTO_UDP UDP協議
IPPROTO_SCTP SCTP傳輸協議
IPPROTO_ICMP ICMP協議
IPPROTO_IGMP IGMP協議
一般情況下IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP協議用的最多,UDP協議protocol就取IPPROTO_UDP,TCP協議protocol就取IPPROTO_TCP;一般情況下,我們讓protocol等於0就可以,系統會給它默認的協議。但是要是使用raw socket協議,protocol就不能簡單設為0,要與type參數匹配.
4、返回值:
成功時返回一個小的非負整數值,他與文件描述符類似,我們稱為套接字描述符,簡稱sockfd。失敗,則返回-1。
5、例子:
g_ulDevRawSock = socket( PF_PACKET, SOCK_RAW, htons(ETH_DEV) ); //#define ETH_DEV 0x8607
iFd = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
fd = socket(PF_INET, SOCK_DGRAM, 0);
dnc_socket = socket(AF_INET, SOCK_STREAM, 0);
pupdate_info->update_socket = socket(PF_PACKET, SOCK_RAW, htons(0x8505)
二、connect函數
1、頭文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
2、函數原型:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
TCP客戶端通過connect函數與服務端連接,進行通信。
3、函數形參:
3.1、sockfd(客戶端自己創建的sock)
3.2、addr(服務端地址族、服務端IP地址、服務端端口號)
3.3、addrlen(服務端地址字節長度)
4、返回值:
連接成功,返回0,連接失敗,返回-1
5、例子:
seraddr.sin_family = AF_INET; // 設置地址族為IPv4
seraddr.sin_port = htons(SERPORT); // 設置地址的端口號信息
seraddr.sin_addr.s_addr = inet_addr(SERADDR); // 設置IP地址
ret = connect(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));
三、bind函數
1、頭文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
2、函數原型:
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
服務端套接字綁定自己的IP地址與端口號,客戶端那邊可以不寫,內核會給它分配一個臨時的端口。
3、函數形參:
3.1、sockfd:服務器或者客戶端自己創建的socket
3.2、addr:服務器或者客戶端自己的地址信息(協議族、IP、端口號)
3.3、addrlen:服務器或者客戶端自己的地址信息的長度
4、返回值:
綁定成功,返回0,失敗返回-1
5、例子:
seraddr.sin_family = AF_INET; // 設置地址族為IPv4
seraddr.sin_port = htons(SERPORT); // 設置地址的端口號信息
seraddr.sin_addr.s_addr = inet_addr(SERADDR); // 設置IP地址
ret = bind(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));
