套接字是一種通訊機制(通訊的兩方的一種約定),憑藉這種機制,不同主機之間的程序可以進行通訊。我們可以用套接字中的相關函式來完成通訊過程。
套接字的特性有三個屬性確定,它們是:域(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,主機位元組序和網路...