【Linux网络编程】套接字的介绍
发布日期:2021-06-29 20:57:15 浏览次数:2 分类:技术文章

本文共 4891 字,大约阅读时间需要 16 分钟。

套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信。我们可以用套接字中的相关函数来完成通信过程

套接字的特性有三个属性确定,它们是:域(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-based                   byte streams.  */#define SOCK_STREAM SOCK_STREAM  SOCK_DGRAM = 2,       /* Connectionless, unreliable datagrams                   of fixed maximum length.  */#define SOCK_DGRAM SOCK_DGRAM  SOCK_RAW = 3,         /* Raw protocol interface.  */#define SOCK_RAW SOCK_RAW  SOCK_RDM = 4,         /* Reliably-delivered messages.  */#define SOCK_RDM SOCK_RDM  SOCK_SEQPACKET = 5,       /* Sequenced, reliable, connection-based,                   datagrams of fixed maximum length.  */#define SOCK_SEQPACKET SOCK_SEQPACKET  SOCK_PACKET = 10      /* Linux specific way of getting packets                   at the dev level.  For writing rarp and                   other 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;};

转载地址:https://dengjin.blog.csdn.net/article/details/52331818 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Linux网络编程】UDP编程
下一篇:【Linux系统编程】I/O多路复用select、poll、epoll的区别使用

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月23日 22时47分27秒