概述
通过网卡,让我们能达到通信,对unix是相当的复杂,组要是socket每一层都是用了不同的通信协议,需要好多设置好多的选项。因此在/dev目录下,并没有网卡对应的文件。 socket不仅可以用于各种传输协议的IP的连接。也可以用于内核支持的所有其他地址和协议类型
通过网卡,让我们能达到通信,对unix是相当的复杂,组要是socket每一层都是用了不同的通信协议,需要好多设置好多的选项。因此在/dev目录下,并没有网卡对应的文件。
socket不仅可以用于各种传输协议的IP的连接。也可以用于内核支持的所有其他地址和协议类型。
套接字是使用socket库函数生成的。然后bind函数等。
socket主要用于协议的选择,通信类型,地址族。
bind函数主要目的是给到戒子分配本地地址。该函数的传递一个sockaddr_type 的参数,定义了本地地址。因为不同地址组的地址类型是不同的。type制定了所需的地址类型。
这个时候,我们来点代码
#ifndef _LINUX_IN_H
#define _LINUX_IN_H
#include
#include
/* 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内核网络 通信,linux内核学习之网络篇——通过socket通信的全部内容,希望文章能够帮你解决linux内核网络 通信,linux内核学习之网络篇——通过socket通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复