在struct udp_sock中,struct inet_sock inet为其第一个成员变量。而对应struct tcp_sock,其第一个成员变量是struct inet_connection_sock inet_conn,不过struct inet_connection_sock inet_conn的第一个成员变量依然是struct inet_sock inet。所以无论是udp_sock还是tcp_sock,其内存布局上都保证了struct inet_sock ...
struct inet_sock。 这是INET域专用的一个socket表示,它是在struct sock的基础上进行的扩展,在基本socket的属性已具备的基础上,struct inet_sock提供了INET域专有的一些属性,比如TTL,组播列表,IP地址,端口等,下面是其完整定义: struct inet_sock { struct sock sk; #if defined(CONFIG_IPV6) || defined(CONFIG...
看完上面两个,我们觉得第三个应该就是struct tcp_sock了,但事实上,struct tcp_sock并不直接从struct inet_sock上扩展,而是从struct inet_connection_sock基础上进行扩展,struct inet_connection_sock是所有面向连接的socket的表示,关于该socket,及下面所有tcp相关的socket,我们在分析 tcp实现时再详细介绍,这里只列出它...
struct tcp_sock 从 struct inet_connection_sock 结构体的基础上继承而来,在 struct inet_connection_sock 上增加了一些tcp协议相关的字段,如滑动窗口协议,拥塞算法等一些TCP专有的属性。由于这种继承关系,可以互相转换,如下举例两种转换方式,第一种是struct sock转换为struct tcp_sock,第二种是struct sock转换成struc...
int inet_sock; struct ifreq ifr; inet_sock = socket(AF_INET, SOCK_DGRAM, 0); strcpy(ifr.ifr_name, "eth0"); //SIOCGIFADDR标志代表获取接口地址 if (ioctl(inet_sock, SIOCGIFADDR, &ifr) < 0) perror("ioctl"); printf("%s\n", inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin...
ssize_t (*sendpage)(struct socket *sock, struct page *page, int offset, size_t size, int flags); }; 协议栈中总共定义了三个strcut proto_ops类型的变量,分别是myinet_stream_ops, myinet_dgram_ops, myinet_sockraw_ops,对应流协议, 数据报和原始套接口协议的操作函数集。
struct sock结构的简单注释 --- 转 内核网络四层结构:BSD socket层、INET socket层、IP层、数据链路层 sock结构工作在INET socket层,所有BSD socket层的操作都通过struct sock 及其域字段prot指针转化为prot锁指向的函数处理,所以sock结构是维系 BSD socket层和INET socket层的纽带,其重要性是不言而喻的。
struct inet_sock。 这是INET域专用的一个socket表示,它是在struct sock的基础上进行的扩展,在基本socket的属性已具备的基础上,struct inet_sock提供了INET域专有的一些属性,比如TTL,组播列表,IP地址,端口等,下面是其完整定义: C代码 1.struct inet_sock { 2.struct sock sk; 3.#if defined(CONFIG_IPV6) ...
inet_addr()是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)。 通常的用法是: int sockfd; struct sockaddr_in my_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 做一些错误检查! */ my_addr.sin_family = AF_INET; /* 主机字节序 */ ...
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0) { perror("socket"); exit(1); } ioctl(sockfd, SIOCGIFCONF, &ifconf);//获取所有接口信息 //接下来一个一个的获取IP地址 ifreq = (structifreq*)buf; for(i=(ifconf.ifc_len/sizeof(structifreq)); i>0; i--) ...