韦德国际官网总结一下遇到的几个sockaddr数据结构的用法,原生js二级联动

总结一下遇到的几个sockaddr数据结构的用法

/***********ipv4的套接字地址*********************************/

struct sockaddr_in {
__kernel_sa_family_t  sin_family; /* AF_INET */
__be16                sin_port; /* Port number */
struct in_addr        sin_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)];
};




/********* ipv6的套接字地址***********************/

struct sockaddr_in6 {
unsigned short int sin6_family; /* AF_INET6 */
__be16                  sin6_port; /* Transport layer port # */
__be32                  sin6_flowinfo; /* IPv6 flow information */
struct in6_addr         sin6_addr; /* IPv6 address */
__u32                   sin6_scope_id; /* scope id (new in RFC2553) */
};



/*********netlink通讯的套接字地址**************************/
struct sockaddr_nl {
__kernel_sa_family_t    nl_family; /* AF_NETLINK */
unsigned short  nl_pad; /* zero */
__u32           nl_pid; /* port ID */
__u32           nl_groups; /* multicast groups mask */
};



/*设备无关的物理层地址结构,通过setsockopt可以设置网卡的多播或混杂模*/

struct sockaddr_ll {
unsigned short  sll_family; /* AF_PACKET*/
__be16        sll_protocol;
int sll_ifindex;
unsigned short  sll_hatype;
unsigned char   sll_pkttype;
unsigned char   sll_halen;
unsigned char   sll_addr[8];
};linux 2.0 以前的版本是用structsockaddr_pkt 的,而且获取二层的socket是通过socket(AF_INET, SOCK_PACKET, protocol)来获取的,并没有AF_PACKET 这个domain ,只有SOCK_PACKET这个socket_type



/*********通用套接字地址**************************/

struct sockaddr { 
sa_family_t     sa_family; /* address family, AF_xxx */
char            sa_data[14]; /* 14 bytes of protocol address */
};


#define _K_SS_MAXSIZE128/* Implementation specific max size */
#define _K_SS_ALIGNSIZE(__alignof__ (struct sockaddr *))
/* Implementation specific desired alignment */

typedef unsigned short __kernel_sa_family_t;

#define sockaddr_storage __kernel_sockaddr_storage
struct __kernel_sockaddr_storage {
__kernel_sa_family_tss_family;/* address family */
/* Following field(s) are implementation specific */
char__data[_K_SS_MAXSIZE - sizeof(unsigned short)];
/* space to achieve desired size, */
/* _SS_MAXSIZE value minus size of ss_family */
} __attribute__ ((aligned(_K_SS_ALIGNSIZE)));/* force desired alignment */
struct sockaddr 和struct sockaddr_storage 都是通用套接字

为了统一各种协议,socket对应的接口就定义了两个通用结构,分别是sockaddr(16字节)和sockaddr_storage(128字节)
,其中sockaddr_storage是为了适配sockaddr_in6(28字节)这样长度比较大的协议而后来定义的,如果需要用到sockaddr_storage
这样的通用套接字,则强转为sockaddr,并且长度用sizeof(struct
sockaddr_storage)

网络编程中的一下几个接口会用到以上的数据结构

应用层->内核,对应用层来说就是发送的,数据是送到协议栈的,addrlen是入参

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

int connect(int sockfd, const structsockaddr *serv_addr, socklen_t
addrlen);

int sendto (int s, const void *msg, size_tlen, int flags, const struct
sockaddr *to, socklen_t tolen);

内核->应用层的,对应用层来说就是接收的,数据从协议栈上来的,addrlen是值-结果参数

intaccept (int s, struct sockaddr*addr, socklen_t *addrlen);

int recvfrom(int s, void *buf, size_t len, intflags, struct sockaddr
*from, socklen_t *fromlen);

intgetpeername(int s, struct sockaddr *name, socklen_t *namelen);

int getsockname(int s, struct sockaddr *name,socklen_t *namelen);

getsockname: 返回本地协议地址:getpeername:返回远程协议地址

适用场景:

1.当不用bind()或调用bind()没有指定本地协议地址时,可以调用getsockname()来返回内核分配给此连接的本地IP地址和端口号,还可以获得某套接口的协议族。

2.当一个新的连接建立时,服务器也可以调用getsockname()来获得分配给此连接的本地IP地址。

3.当一个服务器的子进程调用exec函数启动执行时,只能调用getpeername()函数来获得客户的Ip地址和端口号。

4.未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。在返回时,namelen参数包含了名字的实际字节数。

/***********ipv4的套接字地址*********************************/
struct sockaddr_in { __kernel_sa_family_t sin_family;…

HTML规范,html编码规范

  1. 正确的文档类型;

2.使用小写元素名,看起来清爽且容易编写;

3.关闭每个需要关闭的标签;

4.关闭空的HTML元素,如<meta />;

5.属性名用小写;

6.属性值用引号;

7.图片添加alt属性;

8.避免一行代码过长,尽量少于80个字符;

9.不要无缘无故添加空行;

10.缩进建议使用两个空格,不建议用Tab;

11.H5中不推荐省略<html><body><head>;

12.多行注释第一个字符缩进两个空格,更易阅读;

13.样式表

    (1)花括号与选择器同一行,之间加一空格;

    (2)使用两个空格来缩进;

    (3)冒号与属性之间加空格;

    (4)只有属性值包含空格才用引号;

    (5)右花括号放在新的一行;

    (6)每行最多80个字符;

14.载入js和样式表时,type不是必需的;

1. 正确的文档类型;
2.使用小写元素名,看起来清爽且容易编写; 3.关闭每个需要关闭的标签;
4.关闭空的HTML元素,…

原生js二级联动,js联动

今天说的这个是原生js的二级联动,在空白页面里动态添加并作出相对应的效果。 


1 //创建两个下拉列表 select标签 是下拉列表
 2             var sel = document.createElement("select");
 3             var sel1 = document.createElement("select");
 4             //添加到body
 5             document.body.appendChild(sel);
 6             document.body.appendChild(sel1);
 7 //            创建一个数组
 8             var firstSelectArr  = ["未选择","医院","学校","公司","星座"];
 9             var detailFirstArr  = ["未选择","院长","主任","大夫","护士"];
10             var detailSecondArr = ["未选择","校长","老师","学生","主任"];
11             var arr2 = ["未选择","CEO","职员","主任","下属"];
12             var arr3 = ["未选择","白羊座","射手座","处女座","天秤座"];
13             function addChild(arr,parentN){
14                 //封装函数
15                 for(var i=0;i<arr.length;i++){
16                 //创建 option节点
17                 var opt = document.createElement("option");
18                 //设置显示文字
19                 opt.innerText = arr[i];
20                 //把节点添加到sel中
21                 parentN.appendChild(opt);
22                 
23             }
24             }
25             //调用函数 给第一个select添加option
26             addChild(firstSelectArr,sel)
27             
28             //循环创建多个下拉选项
29             
30             //给第一个下拉列表添加onchange事件
31             //onchange事件:当元素的值发生改变时,触发此事件。
32             sel.onchange = function (){
33 //                selectdIndex.下拉列表的索引 
34                 console.log(sel.selectedIndex);
35                  switch (sel.selectedIndex){
36                      case 0:
37                      alert("未选择");
38                      break;
39                      case 1:
40                      delectOldOpt();
41                      addChild(detailFirstArr,sel1);
42                      break;
43                      case 2:
44                      delectOldOpt();
45                      addChild(detailSecondArr,sel1);
46                      break;
47                      case 3:
48                      delectOldOpt();
49                      addChild(arr2,sel1);
50                      break;
51                      case 4:
52                      delectOldOpt();
53                    addChild(arr3,sel1);
54                      break;
55                  }
56                  
57                  
58                 }
59             //删除select原来的option
60             function delectOldOpt(){
61                 //到这删除下拉列表中的选项
62                 for(var i=sel1.childNodes.length-1;i>=0;i--){
63                     //删除选项
64                     sel1.removeChild(sel1.childNodes[i]);
65                 }
66                 
67             }
68   
    这样就完成了一个最简单的二级联动,希望可以帮到你们!!!!

 

今天说的这个是原生js的二级联动,在空白页面里动态添加并作出相对应的效果。
1 // 创建两个下拉列表 select标签…

发表评论

电子邮件地址不会被公开。 必填项已用*标注