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

通过网卡,让我们能达到通信,对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 函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值