Linux 網路程式設計 套接字的介紹

2021-07-28 18:25:09 字數 4168 閱讀 1614

套接字是一種通訊機制(通訊的兩方的一種約定),憑藉這種機制,不同主機之間的程序可以進行通訊。我們可以用套接字中的相關函式來完成通訊過程

套接字的特性有三個屬性確定,它們是:域(domain),型別(type),和協議(protocol)

域指定套接字通訊中使用的網路介質。最常見的套接字域是 af_inet(ipv4)或者af_inet6(ipv6),它是指 internet 網路,許多 linux 區域網使用的都是該網路,當然,網際網路自身用的也是它。

流套接字(sock_stream):

流套接字用於提供面向連線、可靠的資料傳輸服務。該服務將保證資料能夠實現無差錯、無重**送,並按順序接收。流套接字之所以能夠實現可靠的資料服務,原因在於其使用了傳輸控制協議,即tcp(the transmission control protocol)協議。

資料報套接字(sock_dgram):

資料報套接字提供了一種無連線的服務。該服務並不能保證資料傳輸的可靠性,資料有可能在傳輸過程中丟失或出現資料重複,且無法保證順序地接收到資料。資料報套接字使用udp(user datagram protocol)協議進行資料的傳輸。由於資料報套接字不能保證資料傳輸的可靠性,對於有可能出現的資料丟失情況,需要在程式中做相應的處理。

原始套接字(sock_raw):

原始套接字與標準套接字(標準套接字指的是前面介紹的流套接字和資料報套接字)的區別在於:原始套接字可以讀寫核心沒有處理的ip資料報,而流套接字只能讀取tcp協議的資料,資料報套接字只能讀取udp協議的資料。因此,如果要訪問其他協議傳送資料必須使用原始套接字。

只要底層的傳輸機制允許不止乙個協議來提供要求的套接字型別,我們就可以為套接字選擇乙個特定的協議。通常使用預設即可(也就是最後乙個引數填「0」)

建立套接字

socket 系統呼叫建立乙個套接字並返回乙個描述符,該描述符可以用來訪問該套接字。

需要標頭檔案:#include

int socket(int family,int type,int protocol);

功能:建立乙個用於網路通訊的 socket 套接字(描述符)

引數:family:協議族(af_unix、af_inet、af_inet6、pf_packet等)

最常見的套接字域是 af_unix 和 af_inet,前者用於通過 unix 和 linux 檔案系統實現的本地套接字,後者用於 unix 網路套接字。af_inet 套接字可以用於通過包括網際網路在內的 tcp/ip 網路進行通訊的程式。微軟 windows 系統的 winsock 介面也提供了對這個套接字域的訪問功能。

/* 

* address families. 

*/  

#define af_unspec       0               /* unspecified */  

#define af_unix         1               /* local to host (pipes, portals) */  

#define af_inet         2               /* internetwork: udp, tcp, etc. */  

#define af_implink      3               /* arpanet imp addresses */  

#define af_pup          4               /* pup protocols: e.g. bsp */  

#define af_chaos        5               /* mit chaos protocols */  

#define af_ipx          6               /* ipx and spx */  

#define af_ns           6               /* xerox ns protocols */  

#define af_iso          7               /* iso protocols */  

#define af_osi          af_iso          /* osi is iso */  

#define af_ecma         8               /* european computer manufacturers */  

#define af_datakit      9               /* datakit protocols */  

#define af_ccitt        10              /* ccitt protocols, x.25 etc */  

#define af_sna          11              /* ibm sna */  

#define af_decnet       12              /* decnet */  

#define af_dli          13              /* direct data link inte***ce */  

#define af_lat          14              /* lat */  

#define af_hylink       15              /* nsc hyperchannel */  

#define af_netbios      17              /* netbios-style addresses */  

#define af_voiceview    18              /* voiceview */  

#define af_firefox      19              /* firefox */  

#define af_unknown1     20              /* somebody is using this! */  

#define af_ban          21              /* banyan */  

#define af_max          22

type:套接字型別(sock_stream、sock_dgram、sock_raw等

/* 

* types 

*/  

#define sock_stream     1               /* stream socket */  

#define sock_dgram      2               /* datagram socket */  

#define sock_raw        3               /* raw-protocol inte***ce */  

#define sock_rdm        4               /* reliably-delivered message */  

#define sock_seqpacket  5               /* sequenced packet stream */

protocol:協議類別(0、ipproto_tcp、ipproto_udp等),設為 0 表示使用預設協議。

返回值:

成功:套接字

失敗(<0)

建立 udp 套接字示例:

int sockfd;  

sockfd = socket(af_inet, sock_dgram, 0);  

if(sockfd < 0)  

套接字位址

struct sockaddr_un ;
struct sockaddr_in
struct in_addr

UNIX網路程式設計 套接字程式設計介紹

列印當前機器是小頭派還是大頭派型別 注意,如果沒有加這兩個標頭檔案 include include 編譯時候會報 警告 隱式宣告與內建函式 printf 不相容 這個錯誤 編譯 gcc o byteorder byteorder.c include include int main int argc...

網路套接字程式設計介紹 UDP通訊

知識內容 1.udp通訊程式設計流程 2.套接字介面介紹 一 udp通訊程式設計 1.建立套接字 在核心中建立乙個socket結構體,返回乙個檔案描述符作為操作控制代碼,用於使程序與網絡卡之間建立聯絡 2.為套接字繫結位址資訊 在核心的socket結構體中新增描述資訊 位址資訊 告訴作業系統自己使用...

Linux網路程式設計 套接字結構

1,結構體 struct sockaddr,struct sockaddr in,struct in addr 通用套接字資料結構 struct sockaddr實際使用的套接字資料結構,二者可以進行型別轉換 struct sockaddr in struct in addr 2,主機位元組序和網路...