【Linux网络编程】套接字的介绍
套接字是一種通信機制(通信的兩方的一種約定),憑借這種機制,不同主機之間的進程可以進行通信。我們可以用套接字中的相關函數來完成通信過程。
套接字的特性有三個屬性確定,它們是:域(domain),類型(type),和協議(protocol)。
套接字的域
域指定套接字通信中使用的網絡介質。最常見的套接字域是 AF_INET,它是指 Internet 網絡,許多 Linux 局域網使用的都是該網絡,當然,因特網自身用的也是它。
套接字類型
流套接字(SOCK_STREAM):
流套接字用于提供面向連接、可靠的數據傳輸服務。該服務將保證數據能夠實現無差錯、無重復發送,并按順序接收。流套接字之所以能夠實現可靠的數據服務,原因在于其使用了傳輸控制協議,即TCP(The Transmission Control Protocol)協議。
數據報套接字(SOCK_DGRAM):
數據報套接字提供了一種無連接的服務。該服務并不能保證數據傳輸的可靠性,數據有可能在傳輸過程中丟失或出現數據重復,且無法保證順序地接收到數據。數據報套接字使用UDP(User Datagram Protocol)協議進行數據的傳輸。由于數據報套接字不能保證數據傳輸的可靠性,對于有可能出現的數據丟失情況,需要在程序中做相應的處理。
原始套接字(SOCK_RAW):
原始套接字與標準套接字(標準套接字指的是前面介紹的流套接字和數據報套接字)的區別在于:原始套接字可以讀寫內核沒有處理的IP數據包,而流套接字只能讀取TCP協議的數據,數據報套接字只能讀取UDP協議的數據。因此,如果要訪問其他協議發送數據必須使用原始套接字。
套接字協議(協議類別)
只要底層的傳輸機制允許不止一個協議來提供要求的套接字類型,我們就可以為套接字選擇一個特定的協議。通常使用默認即可(也就是最后一個參數填“0”)。
創建套接字
socket 系統調用創建一個套接字并返回一個描述符,該描述符可以用來訪問該套接字。
需要頭文件:#include <sys/socket.h>
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 接口也提供了對這個套接字域的訪問功能。
/* Supported address families. */ #define AF_UNSPEC 0 #define AF_UNIX 1 /* Unix domain sockets */ #define AF_LOCAL 1 /* POSIX name for AF_UNIX */ #define AF_INET 2 /* Internet IP Protocol */ #define AF_AX25 3 /* Amateur Radio AX.25 */ #define AF_IPX 4 /* Novell IPX */ #define AF_APPLETALK 5 /* AppleTalk DDP */ #define AF_NETROM 6 /* Amateur Radio NET/ROM */ #define AF_BRIDGE 7 /* Multiprotocol bridge */ #define AF_ATMPVC 8 /* ATM PVCs */ #define AF_X25 9 /* Reserved for X.25 project */ #define AF_INET6 10 /* IP version 6 */ #define AF_ROSE 11 /* Amateur Radio X.25 PLP */ #define AF_DECnet 12 /* Reserved for DECnet project */ #define AF_NETBEUI 13 /* Reserved for 802.2LLC project*/ #define AF_SECURITY 14 /* Security callback pseudo AF */ #define AF_KEY 15 /* PF_KEY key management API */ #define AF_NETLINK 16 #define AF_ROUTE AF_NETLINK /* Alias to emulate 4.4BSD */ #define AF_PACKET 17 /* Packet family */ #define AF_ASH 18 /* Ash */ #define AF_ECONET 19 /* Acorn Econet */ #define AF_ATMSVC 20 /* ATM SVCs */ #define AF_SNA 22 /* Linux SNA Project (nutters!) */ #define AF_IRDA 23 /* IRDA sockets */ #define AF_PPPOX 24 /* PPPoX sockets */ #define AF_WANPIPE 25 /* Wanpipe API Sockets */ #define AF_LLC 26 /* Linux LLC */ #define AF_TIPC 30 /* TIPC sockets */ #define AF_BLUETOOTH 31 /* Bluetooth sockets */ #define AF_IUCV 32 /* IUCV sockets */ #define AF_MAX 33 /* For now.. *//* Protocol families, same as address families. */ #define PF_UNSPEC AF_UNSPEC #define PF_UNIX AF_UNIX #define PF_LOCAL AF_LOCAL #define PF_INET AF_INET #define PF_AX25 AF_AX25 #define PF_IPX AF_IPX #define PF_APPLETALK AF_APPLETALK #define PF_NETROM AF_NETROM #define PF_BRIDGE AF_BRIDGE #define PF_ATMPVC AF_ATMPVC #define PF_X25 AF_X25 #define PF_INET6 AF_INET6 #define PF_ROSE AF_ROSE #define PF_DECnet AF_DECnet #define PF_NETBEUI AF_NETBEUI #define PF_SECURITY AF_SECURITY #define PF_KEY AF_KEY #define PF_NETLINK AF_NETLINK #define PF_ROUTE AF_ROUTE #define PF_PACKET AF_PACKET #define PF_ASH AF_ASH #define PF_ECONET AF_ECONET #define PF_ATMSVC AF_ATMSVC #define PF_SNA AF_SNA #define PF_IRDA AF_IRDA #define PF_PPPOX AF_PPPOX #define PF_WANPIPE AF_WANPIPE #define PF_LLC AF_LLC #define PF_TIPC AF_TIPC #define PF_BLUETOOTH AF_BLUETOOTH #define PF_IUCV AF_IUCV #define PF_MAX AF_MAX
type:套接字類型(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW等)? ?
/* Types of sockets. */ enum __socket_type {SOCK_STREAM = 1, /* Sequenced, reliable, connection-basedbyte streams. */ #define SOCK_STREAM SOCK_STREAMSOCK_DGRAM = 2, /* Connectionless, unreliable datagramsof fixed maximum length. */ #define SOCK_DGRAM SOCK_DGRAMSOCK_RAW = 3, /* Raw protocol interface. */ #define SOCK_RAW SOCK_RAWSOCK_RDM = 4, /* Reliably-delivered messages. */ #define SOCK_RDM SOCK_RDMSOCK_SEQPACKET = 5, /* Sequenced, reliable, connection-based,datagrams of fixed maximum length. */ #define SOCK_SEQPACKET SOCK_SEQPACKETSOCK_PACKET = 10 /* Linux specific way of getting packetsat the dev level. For writing rarp andother similar things on the user level. */ #define SOCK_PACKET SOCK_PACKET };
protocol:協議類別(0、IPPROTO_TCP、IPPROTO_UDP等),設為 0 表示使用默認協議。
返回值:
成功:套接字
失敗(<0)
創建 UDP 套接字示例:
運行結果如下:
套接字地址
每個套接字(端點)都有其自己的地址格式,對于 AF_UNIX 套接字來說,它的地址由結構 sockaddr_un 來描述,該結構體定義在頭文件 sys/un.h 中,如下:
struct sockaddr_un {sa_family_t sun_family; //套接字域char sun_path[];//名字 };
而在 AF_INET 域中,套接字地址結構由 sockaddr_in 來指定,該結構體定義在頭文件 netinet/in.h 中:
struct sockaddr_in {short int sin_family;//套接字域unsigned short int sin_port;//端口struct in_addr sin_addr; //地址char sin_zero[8]; }
IP 地址結構 sin_addr 被定義如下:
struct in_addr {unsigned long int s_addr; };
總結
以上是生活随笔為你收集整理的【Linux网络编程】套接字的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux系统编程】I/O多路复用se
- 下一篇: 【SDL】SDL简介