(1)socket套接字
? ? ? ? ? ? ?1)在linux環境下,socket用于表示進程間網絡通信的特殊文件類型,其本質是內核借助緩沖區形成的偽文件(不占磁盤空間,除此之外還有二進制文件,管道,字符文件)。
? ? ? ? ? ? ?2)偽文件也可以像文件一樣的操作(讀寫),區別在于管道用于本地進程間的通信,套接字多用于網絡進程間數據的傳遞。?
? ? ? ? ? ? ?3)在TCP/IP協議中,IP地址可以在網絡環境中唯一標識一個主機,端口號則在主機中唯一標識一個進程。因此在網絡中,IP地址+端口號就對應一個socket。
? ? ? ? ? ? ?4)在網絡通信中,套接字一定成對存在。一段的發送緩沖區對應對端的接收緩沖區,使用同一個文件描述符可以操作發送緩沖區和接收緩存區。(全雙工,文件描述符一個,數據緩存區兩個)
(2)網絡字節序
? ? ? ? ? ? ? 1)大端字節序:低地址高位、高地址低位
? ? ? ? ? ? ? ? ? ? 小端字節序:低地址低位,高地址高位(windows)
? ? ? ? ? ? ?2)網絡數據流地址規定:先發出的數據是低地址,后發出的數據是高地址。
? ? ? ? ? ? ? ? ? ?TCP/IP協議規定,網絡數據流采用大端字節序,即低地址高字節。
? ? ? ? ? ? ?3)為了保證網絡程序具有可移植性,需要調用庫函數做網絡字節序和主機字節序的轉換。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? #include<arpa/inet.h>
? ? ? ? ? ? ? ? ? ? ? ? ? ?uint32_t? ?htonl(uint32_t? ?hostlong);? //host to net long? ?IP
? ? ? ? ? ? ? ? ? ? ? ? ? ?uint16_t? ?htons(uint16_t? ?hostshort);? //host to net short port?
? ? ? ? ? ? ? ? ? ? ? ? ? ?uint32_t? ?ntohl(uint32_t? ?netlong); //net? to host? long? IP?
? ? ? ? ? ? ? ? ? ? ? ? ? ?uint16_t? ?ntohl(uint16_t? ?netshort);? //net? to host? short port??
? ? ? ? ? ? ?如果主機是小端字節序,這些函數將參數做相應的大小端轉換后返回。如果主機是大端字節序,則不做轉換。
(3)IP地址轉換
? ? ? ? ? ? 1)通常我們所說的IP地址(如192.168.1.200),屬于點分十進制形式,而我們在網絡傳輸中通常使用到的是網絡字節序形式,因此在傳輸的過程中,首先需要把點分十進制形式的字符串轉換為網絡字節序格式。
? ? ? ? ? ? 2)IP地址轉換函數
? ? ? ? ? ? ? ? ? ? ? #include<arpa/inet.h>
? ? ? ? ? ? ? ? int? ? inet_pton(int af? ,const char *src, void *dst);//點分十進制字符串轉換為網路字節序
? ? ? ? ? ? ? ?const? char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//網絡字節序轉換為點分十進制
? ? ? ? ? ? ? ? 參數:af(IP地址格式):AF_INET(IPV4)? ? ? ? ? ? AF_INET6(IPV6)
? ? ? ? ? 3)sockaddr數據結構
? ? ? ? ? ? struct sockaddr誕生于IPV4協議時代,函數的接口通常使用(struct sockaddr),但是現在為了兼容IPV6,將struct sockaddr 改變成了struct sockaddr_t格式(因此現在定義變量時使用struct sockaddr_t,在傳參數時使用struct sockaddr(不能直接用這個定義變量))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
struct? sockaddr{? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? struct sockaddr_in{? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct in_addr{
? ? ? ? ? sa_family_t? ? sa_family;? ? ? ? ? ??_kernel_sa_family_t? ? ?sin_family;? //地址結構類型? ? ? ? ? ? ? _be32 s_addr;IP地址
? ? ? ? ? char? sa_data[14];? ? ? ? ? ? ? ? ? ? ?_be16? ? ? ? ? ? ?sin_port;? ?//端口號? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };
};? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct? in_addr? sin_addr;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?......
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };
?(4)Socket模型創建流程圖
? ? ? ? ? ? ? ? ?注:TCP客戶端沒有調用bind()函數綁定IP和端口號,系統會自動給它分配IP和端口號,但在TCP服務端則不能省去bind()函數。
? ? ? ? ?
(5)網絡套接字函數
? ? ? ? ? ? ? ? ? ?頭文件:#include<sys/types.h>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#include<sys/socket.h>
? ? ? ? ? ? 1)打開一個網絡通訊端口:socket函數(服務端、客戶端)
? ? ? ? ? ? ? ? ? ? ? int? ?socket(int domain, int type ,int protocol);
? ? ? ? ? ? ? ? ? ? ?參數:domain:協議類型,AF_INET(IPV4)? ?AF_INET6(IPV6)? ? ?AF_UNIX(本地協議)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?type:SOCK_STREAM(流失協議,默認為TCP傳輸)? ? ? ?SOCK_DGRAM(報式協議,默認使用UDP傳輸)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?protocol:使用默認協議
? ? ? ? ? ? ? ? ? ? 返回值:成功返回新創建socket的文件描述符,失敗返回-1.
? ? ? ? ?2)綁定IP和端口號:bind函數(服務端/客戶端)
? ? ? ? ? ? ? ? ? ? ? ?int? ?bind(int sockfd ,? const struct sockaddr *addr, socklen_t? addrlen);
? ? ? ? ? ? ? ?參數:sockfd : socket 文件描述符
? ? ? ? ? ? ? ? ? ? ? ? ? ?addr:綁定了IP和端口號的結構體
? ? ? ? ? ? ? ? ? ? ? ? ? addrlen:sizeof(addr)長度
? ? ? ? ? ? ? 返回值:成功返回0,失敗返回-1.
? ? ? ? 3)指定監聽上限數(同一時間允許多少客戶端和服務器連接):listen函數(服務端)
? ? ? ? ? ? ? int? ?listen(int? ?sockfd,? int? backlog)
? ? ? ? ? ? ? ? ? ?參數:backlog:排隊進行三次握手隊列和剛剛建立三次握手隊列的鏈接數和。
? ? ? ? ? ? ? ? ? ?返回值:成功返回0,失敗返回-1
? ? ? 4)接收連接請求:accept函數(服務端調用)
? ? ? ? ? ? int accept(int? sockfd,struct? sockaddr *addr,socklen_t *addrlen);
? ? ? ? ? ? ? ? ? 參數:addr(傳出參數)返回鏈接客戶端地址信息,含IP和端口號。
? ? ? 5)連接客戶端:connect函數(客戶端調用)
? ? ? ? ? ? int? ?connect(int? sockfd,const struct *sockaddr,socklen_t addrlen)
? ? ? ? ? ? ? ? ?參數:addr:傳入參數,指定服務器的地址信息,含IP地址和端口號。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?addrlen:sizeof(addr)大小
? ? ? ? ? ? ? ? 返回值:成功返回0,失敗返回-1.
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? addrlen(傳入傳出參數):傳入sizeof(addr)大小,函數返回真正接收到的地址結構體的大小。
? ? ? ? ? ? ? ? 返回值:生成一個新的socket文件描述符,用于和客戶端通信,失敗返回-1
(6) C/S模型之TCP:實現最簡單的客戶端、服務器程序
? ? ? ? ? ? ?服務器端:可通過命令nc? +自己ip +端口號完成自我通信(在不同進程使用)nc 182.168.1.100 6666
? ? ? ? ? ? ? ?
? ? ? ? ? ? 客戶端:
? ? ? ? ??