linux内核学习之网络篇——通过socket通信

通过网卡,让我们能达到通信,对unix是相当的复杂,组要是socket每一层都是用了不同的通信协议,需要好多设置好多的选项。因此在/dev目录下,并没有网卡对应的文件。

socket不仅可以用于各种传输协议的IP的连接。也可以用于内核支持的所有其他地址和协议类型。

套接字是使用socket库函数生成的。然后bind函数等。

socket主要用于协议的选择,通信类型,地址族。

bind函数主要目的是给到戒子分配本地地址。该函数的传递一个sockaddr_type 的参数,定义了本地地址。因为不同地址组的地址类型是不同的。type制定了所需的地址类型。

这个时候,我们来点代码

#ifndef _LINUX_IN_H#define _LINUX_IN_H#include <linux/types.h>#include <linux/socket.h>/* Standard well-defined IP protocols.  */enum {  IPPROTO_IP = 0,/* Dummy protocol for TCP*/  IPPROTO_ICMP = 1,/* Internet Control Message Protocol*/  IPPROTO_IGMP = 2,/* Internet Group Management Protocol*/  IPPROTO_IPIP = 4,/* IPIP tunnels (older KA9Q tunnels use 94) */  IPPROTO_TCP = 6,/* Transmission Control Protocol*/  IPPROTO_EGP = 8,/* Exterior Gateway Protocol*/  IPPROTO_PUP = 12,/* PUP protocol*/  IPPROTO_UDP = 17,/* User Datagram Protocol*/  IPPROTO_IDP = 22,/* XNS IDP protocol*/  IPPROTO_RSVP = 46,/* RSVP protocol*/  IPPROTO_GRE = 47,/* Cisco GRE tunnels (rfc 1701,1702)*/  IPPROTO_IPV6 = 41,/* IPv6-in-IPv4 tunnelling*/  IPPROTO_ESP = 50,            /* Encapsulation Security Payload protocol */  IPPROTO_AH = 51,             /* Authentication Header protocol       */  IPPROTO_PIM    = 103,/* Protocol Independent Multicast*/  IPPROTO_COMP   = 108,                /* Compression Header protocol */  IPPROTO_SCTP   = 132,/* Stream Control Transport Protocol*/  IPPROTO_RAW = 255,/* Raw IP packets*/  IPPROTO_MAX};/* Internet address. */struct in_addr {__u32s_addr;};#define IP_TOS1#define IP_TTL2#define IP_HDRINCL3#define IP_OPTIONS4#define IP_ROUTER_ALERT5#define IP_RECVOPTS6#define IP_RETOPTS7#define IP_PKTINFO8#define IP_PKTOPTIONS9#define IP_MTU_DISCOVER10#define IP_RECVERR11#define IP_RECVTTL12#defineIP_RECVTOS13#define IP_MTU14#define IP_FREEBIND15#define IP_IPSEC_POLICY16#define IP_XFRM_POLICY17/* BSD compatibility */#define IP_RECVRETOPTSIP_RETOPTS/* IP_MTU_DISCOVER values */#define IP_PMTUDISC_DONT0/* Never send DF frames */#define IP_PMTUDISC_WANT1/* Use per route hints*/#define IP_PMTUDISC_DO2/* Always DF*/#define IP_MULTICAST_IF32#define IP_MULTICAST_TTL 33#define IP_MULTICAST_LOOP 34#define IP_ADD_MEMBERSHIP35#define IP_DROP_MEMBERSHIP36#define IP_UNBLOCK_SOURCE37#define IP_BLOCK_SOURCE38#define IP_ADD_SOURCE_MEMBERSHIP39#define IP_DROP_SOURCE_MEMBERSHIP40#define IP_MSFILTER41#define MCAST_JOIN_GROUP42#define MCAST_BLOCK_SOURCE43#define MCAST_UNBLOCK_SOURCE44#define MCAST_LEAVE_GROUP45#define MCAST_JOIN_SOURCE_GROUP46#define MCAST_LEAVE_SOURCE_GROUP47#define MCAST_MSFILTER48#define MCAST_EXCLUDE0#define MCAST_INCLUDE1/* These need to appear somewhere around here */#define IP_DEFAULT_MULTICAST_TTL        1#define IP_DEFAULT_MULTICAST_LOOP       1/* Request struct for multicast socket ops */struct ip_mreq {struct in_addr imr_multiaddr;/* IP multicast address of group */struct in_addr imr_interface;/* local IP address of interface */};struct ip_mreqn{struct in_addrimr_multiaddr;/* IP multicast address of group */struct in_addrimr_address;/* local IP address of interface */intimr_ifindex;/* Interface index */};struct ip_mreq_source {__u32imr_multiaddr;__u32imr_interface;__u32imr_sourceaddr;};struct ip_msfilter {__u32imsf_multiaddr;__u32imsf_interface;__u32imsf_fmode;__u32imsf_numsrc;__u32imsf_slist[1];};#define IP_MSFILTER_SIZE(numsrc) \(sizeof(struct ip_msfilter) - sizeof(__u32) \+ (numsrc) * sizeof(__u32))struct group_req{__u32 gr_interface;/* interface index */struct __kernel_sockaddr_storage gr_group;/* group address */};struct group_source_req{__u32 gsr_interface;/* interface index */struct __kernel_sockaddr_storage gsr_group;/* group address */struct __kernel_sockaddr_storage gsr_source;/* source address */};struct group_filter{__u32 gf_interface;/* interface index */struct __kernel_sockaddr_storage gf_group;/* multicast address */__u32 gf_fmode;/* filter mode */__u32 gf_numsrc;/* number of sources */struct __kernel_sockaddr_storage gf_slist[1];/* interface index */};#define GROUP_FILTER_SIZE(numsrc) \(sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \+ (numsrc) * sizeof(struct __kernel_sockaddr_storage))struct in_pktinfo{intipi_ifindex;struct in_addripi_spec_dst;struct in_addripi_addr;};/* Structure describing an Internet (IP) socket address. */#define __SOCK_SIZE__16/* sizeof(struct sockaddr)*/struct sockaddr_in {  sa_family_tsin_family;/* Address family*/  unsigned short intsin_port;/* Port number*/  struct in_addrsin_addr;/* Internet address*/  /* Pad to size of `struct sockaddr'. */  unsigned char__pad[__SOCK_SIZE__ - sizeof(short int) -sizeof(unsigned short int) - sizeof(struct in_addr)];};

重点看红色部分, sin_family;地址族 unsigned short int sin_port; 端口号

struct in_addr sin_addr; 网络地址。

在这里考虑到网络字节序还有大端小端的问题。

下面有个简单的例子。

使用了基本的用户函数 socket,bind,listion select 函数




只有他的好身体,没有地方可去,只想到处流浪、人生就像一场旅行,

linux内核学习之网络篇——通过socket通信

相关文章:

你感兴趣的文章:

标签云: