socket socket也稱套接字,網路編程的基礎。一般情況下我不喜歡直接去說socket的函數都是怎麼用的,那個很多人都寫出來了,而且肯定比我好的有的是。 但是今天想寫的是我的理解中,產生socket的原因,我覺得只有瞭解socket的本質、機理,才能更靈活的使用他的API。那樣就會知道為什麼要 ...
socket
socket也稱套接字,網路編程的基礎。一般情況下我不喜歡直接去說socket的函數都是怎麼用的,那個很多人都寫出來了,而且肯定比我好的有的是。
但是今天想寫的是我的理解中,產生socket的原因,我覺得只有瞭解socket的本質、機理,才能更靈活的使用他的API。那樣就會知道為什麼要那樣用,會產生怎樣的效果。
給我的感覺是socket就是一個介面,起著承上啟下的作用。它是應用層與傳輸層的中間產物。
為什麼要這樣說?
首先對應用層來說,不管使用怎樣的傳輸協議只要能達到想要的傳輸結果就可以了,它不管你使用了怎樣的傳輸的方式,只要看到結果就
但是對傳輸層來說,要根據不同的需求使用不同的協議(TCP,UDP 等)去傳輸信息。具體結構如下圖所示:
用socket函數創建socket:
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
函數通過domain判別通信協議,通信協議有:
協議名稱 |
含義 |
PF_UNIX,PF_LOCAL |
本地通信 |
AF_INET,PF_INET |
IPv4 Internet協議 |
PF_INET6 |
IPv6 Internet協議 |
PF_IPX |
IPX-Novell協議 |
PF_NETLINK |
內核用戶界面設備 |
PF_X25 |
ITU-T X25 / ISO-8208協議 |
PF_AX25 |
Amateur radio AX.25 |
PF_ATMPVC |
原始ATM PVC訪問 |
PF_APPLETALK |
Appletalk |
PF_PACKET |
底層包訪問 |
|
|
函數通過type來判別傳輸協議常見的有,流式套接字、數據報套接字、原始套接字等;
名稱 |
含義 |
SOCK_STREAM |
TCP傳輸方式,可靠傳輸,需要連接 |
SOCK_DGRAM |
UDP傳輸方式不需要連接 |
SOCK_SEQPACKET |
序列化包,提供一個序列化的、可靠的、雙向的基本連接的數據傳輸通道,數據長度定常。每次調用讀系統調用時數據需要將全部數據讀出 |
SOCK_RAW |
RAW類型,提供原始網路協議訪問 |
SOCK_RDM |
提供可靠的數據報文,不過可能數據會有亂序 |
SOCK_PACKET |
一個專用類型 |
protocol:確定socket到底支持的哪個協議一般情況下使用TCP或者UDP,可以省略為零,系統會預設設置,但是如果使用原始套接字則需進行具體的設置。
此函數會返回一個int類型的數據,同時以此數據去尋找所創建的socket(你可能創建的不止一個socket),若返回值為-1則表示創建socket失敗,若為一個正值則表示創建成功,由於並不是每次創建都是成功的,因此創建socket時要檢測是否創建成功
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
//創建一個使用IPV4,UDP傳輸的socket
{
perror("socket");
exit(EXIT_FAILURE);
}
總結一句話,socket就是創建一個確定傳輸模式的介面。
此篇博客我有去參考有:
https://blog.csdn.net/xc_tsao/article/details/44123331
https://blog.csdn.net/liuxingen/article/details/44995467
https://blog.csdn.net/qq_33573235/article/details/79292679
大雄技術有限,若有錯誤請指出,共同進步謝謝!