netinet ip icmp.h/in.h和linux/in.h分别在什么情况下使用

查看:4316|回复:3
学习socket中不理解socket的实现原理,求助有这方面开发经验或者有网络开发经验的朋友,谢谢。
版规,发帖可获2无忧币
网上找的,你随便看看吧,比较详细:
1.& && && &什么是TCP/IP、UDP?
2.& && && &Socket在哪里呢?
3.& && && &Socket是什么呢?
4.& && && &你会使用它们吗?
什么是TCP/IP、UDP?
& && && &TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
& && && &UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
& && &&&这里有一张图,表明了这些协议的关系。
& && && && && && && && && && && && && && && && && && && && && && && && && && &&&
& && && && && && && && && && && && && && && && && && && && && && && && &图1
& && & TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。
Socket在哪里呢?
& && & 在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。
& && & 原来Socket在这里。
Socket是什么呢?
& && & Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
你会使用它们吗?
& && & 前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
& && & 一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。& & 生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。
& && & 先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
& && & 在这里我就举个简单的例子,我们走的是TCP协议这条路(见图2)。例子用MFC编写,运行的界面如下:
& && & 在客户端输入服务器端的IP地址和发送的数据,然后按发送按钮,服务器端接收到数据,然后回应客户端。客户端读取回应的数据,显示在界面上。
& && & 下面是接收数据和发送数据的函数:
int& & Receive(SOCKET fd,char *szText,int len)
& && & cnt=
& && & while(cnt&0)
& && && && &&&rc=recv(fd,szText,cnt,0);
& && && && &&&if(rc==SOCKET_ERROR)
& && && && &&&{
& && && && && && && &return -1;
& && && && & }
& && && && & if(rc==0)
& && && && && && && &return len-
& && && && &&&szText+=
& && && && &&&cnt-=
int Send(SOCKET fd,char *szText,int len)
& && & cnt=
& && & while(cnt&0)
& && && && &&&rc=send(fd,szText,cnt,0);
& && && && &&&if(rc==SOCKET_ERROR)
& && && && &&&{
& && && && && && && &return -1;
& && && && &&&}
& && && && &&&if(rc==0)
& && && && && && && &return len-
& && && && &&&szText+=
& && && && &&&cnt-=
服务器端:
& && & 在服务器端,主要是启动Socket和监听线程。
#define DEFAULT_PORT& && &2000
void CServerDlg::OnStart()
& && & sockaddr_
& && & DWORD dwThreadID = 0;
& && & local.sin_family=AF_INET;
& && & //设置的端口为DEFAULT_PORT。
& && & local.sin_port=htons(DEFAULT_PORT);
& && & //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
& && & local.sin_addr.S_un.S_addr=INADDR_ANY;
& && & //初始化Socket
& && & m_Listening = socket(AF_INET,SOCK_STREAM,0);
& && & if(m_Listening == INVALID_SOCKET)
& && && && &&&
& && & //将本地地址绑定到所创建的套接字上
& && & if(bind(m_Listening,(LPSOCKADDR)&local,sizeof(local)) == SOCKET_ERROR )
& && && && &&&closesocket(m_Listening);
& && && && &&&
& && & //创建监听线程,这样也能响应界面上操作。
& && & m_hListenThread = ::CreateThread(NULL,0,ListenThread,this,0,&dwThreadID);
& && & m_StartBtn.EnableWindow(FALSE);
& && & m_StopBtn.EnableWindow(TRUE);
监听线程函数:
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam)
& && & CServerDlg* pDlg = (CServerDlg*)
& && & if(pDlg == NULL)
& && && && &&&return 0;
& && & SOCKET&&Listening = pDlg-&m_L
& && & //开始监听是否有客户端连接。
& && & if(listen(Listening,40) == SOCKET_ERROR)
& && && && &&&return 0;
& && & char szBuf[MAX_PATH];
& && & //初始化
& && & memset(szBuf,0,MAX_PATH);
& && & while(1)
& && && && &&&SOCKET ConnectS
& && && && &&&sockaddr_in& & ClientA
& && && && &&&int& && && && && && &nLen = sizeof(sockaddr);
& && && && &&&//阻塞直到有客户端连接,不然多浪费CPU资源。
& && && && &&&ConnectSocket = accept(Listening,(sockaddr*)&ClientAddr,&nLen);
& && && && &&&//都到客户端的IP地址。
& && && && &&&char *pAddrname = inet_ntoa(ClientAddr.sin_addr);
& && && && &&&pDlg-&Receive(ConnectSocket,szBuf,100);
& && && && &&&//界面上显示请求数据。
& && && && &&&pDlg-&SetRequestText(szBuf);
& && && && &&&strcat(szBuf,& :我是老猫,收到(&);
& && && && &&&strcat(szBuf,pAddrname);
& && && && &&&strcat(szBuf,&)&);
& && && && &&&//向客户端发送回应数据
& && && && &&&pDlg-&Send(ConnectSocket,szBuf,100);
& && & return 0;
& && & 服务器端一直在监听是否有客户端连接,如有连接,处理客户端的请求,给出回应,然后继续监听。
& && & 客户端的发送函数:
#define DEFAULT_PORT& && &2000
void CClientDlg::OnSend()
& && & DWORD dwIP = 0;& && &
& && & TCHAR szText[MAX_PATH];
& && & memset(szText,0,MAX_PATH);
& && & m_IP.GetWindowText(szText,MAX_PATH);
& && & //把字符串形式的IP地址转成IN_ADDR结构需要的形式。
& && & dwIP = inet_addr(szText);
& && & m_RequestEdit.GetWindowText(szText,MAX_PATH);
& && & sockaddr_
& && & SOCKET socketT
& && & //必须是AF_INET,表示该socket在Internet域中进行通信
& && & local.sin_family=AF_INET;
& && & //端口号
& && & local.sin_port=htons(DEFAULT_PORT);
& && & //服务器的IP地址。
& && & local.sin_addr.S_un.S_addr=dwIP;
& && & ////初始化Socket
& && & socketTmp=socket(AF_INET,SOCK_STREAM,0);
& && & //连接服务器
& && & if(connect(socketTmp,(LPSOCKADDR)&local,sizeof(local)) & 0)
& && && && &&&closesocket(socketTmp);
& && && && &&&MessageBox(&连接服务器失败。&);
& && && && &&&
& && & //发送请求,为简单只发100字节,在服务器端也规定100字节。
& && & Send(socketTmp,szText,100);
& && & //读取服务器端返回的数据。
& && & memset(szText,0,MAX_PATH);
& && & //接收服务器端的回应。
& && & Receive(socketTmp,szText,100);
& && & TCHAR szMessage[MAX_PATH];
& && & memset(szMessage,0,MAX_PATH);
& && & strcat(szMessage,szText);
& && & //界面上显示回应数据。
& && & m_ReplyBtn.SetWindowText(szMessage);
& && & closesocket(socketTmp);
& && & 客户端就一个函数完成了一次通信。在这里IP地址为何用127.0.0.1呢?使用这个IP地址,服务器端和客户端就能运行在同一台机器上,这样调试方便多了。当然你可以在你朋友的机器上运行Server程序(本人在局域网中测试过),在自己的机器上运行Client程序,当然输入的IP地址就该是你朋友机器的IP地址了。
& && & 简单的理论和实践都说了,现在Socket编程不神秘了吧?希望对你有些帮助。
本帖最后由 wwwcs59 于
22:42 编辑
简单说和打电话差不多
刚开始会写代码也就行了
引用:原帖由 wwwcs59 于
22:41 发表
网上找的,你随便看看吧,比较详细:
1.& && && &什么是TCP/IP、UDP?
2.& && && &Socket在哪里呢?
3.& && && &Socket是什么呢?
4.& && && &你会使用它们吗?
什么是TCP/IP、UDP?
& && && &TCP/IP(Transmission Control Protoc ... 谢谢谢谢太谢谢啦[][] & [][] &
[libvirt] Redefinition of struct in6_addr in &netinet/in.h& and &linux/in6.h&
From: Cong Wang &amwang redhat com&
To: Thomas Backlund &tmb mageia org&
Cc: libc-alpha sourceware org, netdev vger kernel org, linux-kernel vger kernel org, David, carlos systemhalted org, schwab suse de, tgraf suug ch, libvirt-list redhat com, Miller &davem davemloft net&
Subject: [libvirt] Redefinition of struct in6_addr in &netinet/in.h& and &linux/in6.h&
Date: Wed, 16 Jan :06 +0800
(Cc'ing some glibc developers...)
In glibc source file inet/netinet/in.h and kernel source file
include/uapi/linux/in6.h, both define struct in6_addr, and both are
visible to user applications. Thomas reported a conflict below.
So, how can we handle this? /me is wondering why we didn't see this
at 12:55 +0200, Thomas Backlund wrote:
& Cong Wang skrev 15.1.:
& & Does the following patch help?
& & $ git diff include/uapi/linux/if_bridge.h
& & diff --git a/include/uapi/linux/if_bridge.h
& & b/include/uapi/linux/if_bridge.h
& & index 5dbdb23 100644
& & --- a/include/uapi/linux/if_bridge.h
& & +++ b/include/uapi/linux/if_bridge.h
& & @@ -14,6 +14,7 @@
#define _UAPI_LINUX_IF_BRIDGE_H
#include &linux/types.h&
& & +#include &linux/in6.h&
#define SYSFS_BRIDGE_ATTR
#define SYSFS_BRIDGE_FDB
&brforward&
& Well, I suggested the same fix in the beginning of the thread
& on netdev and lkml: &if_bridge.h: include in6.h for struct in6_addr use&
& as it seemed to fix the libvirt case
& but then asked it to be ignored after I tried to build connman,
& and hit this conflict with glibc-2.17:
& In file included from /usr/include/arpa/inet.h:22:0,
from ./include/connman/inet.h:25,
from src/connman.h:128,
from src/tethering.c:40:
& /usr/include/netinet/in.h:35:5: error: expected identifier before
& numeric constant
& /usr/include/netinet/in.h:197:8: error: redefinition of 'struct in6_addr'
& In file included from /usr/include/linux/if_bridge.h:17:0,
from src/tethering.c:38:
& /usr/include/linux/in6.h:30:8: note: originally defined here
& In file included from /usr/include/arpa/inet.h:22:0,
from ./include/connman/inet.h:25,
from src/connman.h:128,
from src/tethering.c:40:
& /usr/include/netinet/in.h:238:8: error: redefinition of 'struct
& sockaddr_in6'
& In file included from /usr/include/linux/if_bridge.h:17:0,
from src/tethering.c:38:
& /usr/include/linux/in6.h:46:8: note: originally defined here
& In file included from /usr/include/arpa/inet.h:22:0,
from ./include/connman/inet.h:25,
from src/connman.h:128,
from src/tethering.c:40:
& /usr/include/netinet/in.h:274:8: error: redefinition of 'struct ipv6_mreq'
& In file included from /usr/include/linux/if_bridge.h:17:0,
from src/tethering.c:38:
& /usr/include/linux/in6.h:54:8: note: originally defined here
& make[1]: *** [src/src_connmand-tethering.o] Error 1
& So I'm not sure it's the right one...
Follow-Ups:
From: YOSHIFUJI Hideaki
References:
From: Thomas Backlund
From: Eric Blake
From: Thomas Backlund
From: Cong Wang
From: Thomas Backlund
[][] & [][] &当前位置:&&
为什么提示inet_addr,gethostbyaddr错误,头文件#include
#include 我已经包括,在HP机编译没有问题,现在环境
&&&&来源:&互联网& 发布时间:
first referenced
gethostbyaddr
#include &stdio.h&
#include &sys/types.h&
#include &sys/socket.h&
#include &netinet/in.h&
#include &arpa/inet.h&
#include &netdb.h&
#include &sys/cdefs.h&
extern int h_
int main(int argc, char **argv)
struct hostent *
if (argc != 2)
printf("Need to specify an IP address.\n");
if ((hostname = inet_addr(argv[1])) == -1)
printf("Could not find %s\n", argv[1]);
if ((ip = gethostbyaddr((char *)&hostname, sizeof(long), AF_INET)) != NULL)
printf("%s is %s\n", argv[1], ip-&h_name);
printf("Could not resolve %s\n", argv[1]);
-lsocket -lnsl
本页相关标签:
相关技术文章: &&&&
我的硬盘上已经安装了Win2000,并且在分区的时候留了5G没有分,现在想在这5G上安装Redhat7.3,请教大家应该怎样装,是不是用redHat自己就可以分区?谢谢!回答有分!
从光盘启动red hat ,按步骤安装,会提示你分区
一般情况下,/ 2G;swap 128 or 256M; /home 2G或更多
不过分区时要注意,如果你对分区不熟悉,先看看一些有关安装linux的
文章,最好不要自动分区。
另外你还要知道你的机器的硬件信息,如显卡的型号,显示器的水平刷新率
和垂直刷新率等,配置x-window时henzhongyao
http://expert.csdn.ne...... &&&&
如何在red hat8下使用smb?
设置/etc/samba/smb.conf 文件,执行/etc/rc.d/init.d/smb 这样基本可实现linux和windows互访了。
mount -t smbfs WINDOWSHOST/SharedFolder /var/youfolder
...... &&&&
boot the systerm
how to update !!!!!!!!!!!!!kkkkkkk
你不需要更新mbr,只需要更改grub的配置文件/boot/grub/grub.conf
只要更新grub.conf,然后是不是要像lilo那样执行以下lilo呢?
grub是不是要执行以下grub?
......&nbsp最新技术文章: &&&&
我在一张cf1卡上安装了Ubuntu8.04,然后通过Ghost选择硬盘到硬盘(disk to disk)的模式将系统Ghost到另外一张同样的cf2卡上。然后通过cf2卡启动系统,开机后只在屏幕第一行显示GRUB就不动了,键盘也用不了,也进不去grub界面?谁知道这是怎么回事!!!!
希望说的具体点,这问题困扰我好久!!各位大侠帮帮忙啊
除非你的硬件和分区完全一致才行
重装grub到mbr试试
我觉得用clonezilla工具来实现估计更容易
嘿嘿,推荐我推荐给熊猫的clonezilla
...... &&&&
一个机器上的两个网卡在划分到一个子网的时候,出现了本机ping本机 ping不通的情况。改为属于不同子网问题即可解决。可我不太清楚这是问什么?谢谢回答!!
本机ping本机
一块网卡的IP PING另一个的网卡的IP???
为什么要两个网卡划到一个子网呢?太奇怪了
...... &&&&
本帖最后由 chuaimeng 于
14:32:18 编辑
关于pthread_join,我查过的资料都这样描述:pthread_join将阻塞调用线程,直到新建线程退出;可以通过pthread_join自动把线程置于分离状态,这样资源就可以恢复。
这里有两个问题搞不明白:
1、pthread_join将阻塞调用线程,可是我用了一个测试代码,不能证明这一点。线程的执行代码是:
void* fun( void* arg )
for ( i = 0; i & 2; ++i )
printf( "%s\n", arg );
sleep(......&nbsp
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!
(C)2012-,站长邮箱:www_169it_(请将#改为@)#include &netinet/in.h&是什么头文件?_百度知道
#include &netinet/in.h&是什么头文件?
提问者采纳
Internet address family - 互联网地址族
不明白你说的,我想知道这个头文件是什么头文件,我在C++环境下运行不了?是不是头文件名有错误??大虾指点迷津
是linux下的头文件,VC里是不能用的vc下把这个包含语句改为 #include &winsock2.h&#pragma
comment(lib,&ws2_32.lib&)应该就可以了
提问者评价
谢谢你的回答,但是我没有LINUX的环境测试,不过还是谢谢你
来自团队:
其他类似问题
为您推荐:
头文件的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁博客访问: 930548
博文数量: 456
博客积分: 8399
博客等级: 中将
技术积分: 4312
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
在学习了计算机网络的理论基础知识之后,如果能够对Linux下的TCP/IP实现代码进行一定的分析,将十分有利于加深对计算机网络理论的理解,同时能够使我们对网络既有理性的理解,也具有感性的认识。下面我们对Linux ubuntu 2.6.38-8-generic中的/usr/include/netinet/in.h文件结合网络理论进行一些分析。/* Standard well-defined IP protocols.
&&&&IPPROTO_IP = 0,& & & &/* Dummy protocol for TCP.
#define IPPROTO_IP&&&&&&&&IPPROTO_IP
&&&&IPPROTO_HOPOPTS = 0,&&/* IPv6 Hop-by-Hop options.
#define IPPROTO_HOPOPTS&&&&&&&&IPPROTO_HOPOPTS
&&&&IPPROTO_ICMP = 1,&&&&
/* Internet Control Message Protocol.
#define IPPROTO_ICMP&&&&&&&&IPPROTO_ICMP
&&&&IPPROTO_IGMP = 2,&&&&
/* Internet Group Management Protocol. */
#define IPPROTO_IGMP&&&&&&&&IPPROTO_IGMP
&&&&IPPROTO_IPIP = 4,&&&&
/* IPIP tunnels (older KA9Q tunnels use 94).
#define IPPROTO_IPIP&&&&&&&&IPPROTO_IPIP
&&&&IPPROTO_TCP = 6,& & &&/* Transmission Control Protocol.
#define IPPROTO_TCP&&&&&&&&IPPROTO_TCP
&&&&IPPROTO_EGP = 8,& & &&/* Exterior Gateway Protocol.
#define IPPROTO_EGP&&&&&&&&IPPROTO_EGP
&&&&IPPROTO_PUP = 12,&&&&
/* PUP protocol.
#define IPPROTO_PUP&&&&&&&&IPPROTO_PUP
&&&&IPPROTO_UDP = 17,&&&&
/* User Datagram Protocol.
#define IPPROTO_UDP&&&&&&&&IPPROTO_UDP
&&&&IPPROTO_IDP = 22,&&&&
/* XNS IDP protocol.
#define IPPROTO_IDP&&&&&&&&IPPROTO_IDP
&&&&IPPROTO_TP = 29,& & &&/* SO Transport Protocol Class 4.
#define IPPROTO_TP&&&&&&&&IPPROTO_TP
&&&&IPPROTO_DCCP = 33,&&&&/* Datagram Congestion Control Protocol.
#define IPPROTO_DCCP&&&&&&&&IPPROTO_DCCP
&&&&IPPROTO_IPV6 = 41,& &&/* IPv6 header.
#define IPPROTO_IPV6&&&&&&&&IPPROTO_IPV6
&&&&IPPROTO_ROUTING = 43,
/* IPv6 routing header.
#define IPPROTO_ROUTING&&&&&&&&IPPROTO_ROUTING
&&&&IPPROTO_FRAGMENT = 44,&/* IPv6 fragmentation header.
#define IPPROTO_FRAGMENT&&&&IPPROTO_FRAGMENT
&&&&IPPROTO_RSVP = 46,&&&&/* Reservation Protocol.
#define IPPROTO_RSVP&&&&&&&&IPPROTO_RSVP
&&&&IPPROTO_GRE = 47,&&&&
/* General Routing Encapsulation.
#define IPPROTO_GRE&&&&&&&&IPPROTO_GRE
&&&&IPPROTO_ESP = 50,& & &/* encapsulating security payload.
#define IPPROTO_ESP&&&&&&&&IPPROTO_ESP
&&&&IPPROTO_AH = 51,& & &&/* authentication header.
#define IPPROTO_AH&&&&&&&&IPPROTO_AH
&&&&IPPROTO_ICMPV6 = 58,&&/* ICMPv6.
#define IPPROTO_ICMPV6&&&&&&&&IPPROTO_ICMPV6
&&&&IPPROTO_NONE = 59,& &&/* IPv6 no next header.
#define IPPROTO_NONE&&&&&&&&IPPROTO_NONE
&&&&IPPROTO_DSTOPTS = 60,
/* IPv6 destination options.
#define IPPROTO_DSTOPTS&&&&&&&&IPPROTO_DSTOPTS
&&&&IPPROTO_MTP = 92,&&&&
/* Multicast Transport Protocol.
#define IPPROTO_MTP&&&&&&&&IPPROTO_MTP
&&&&IPPROTO_ENCAP = 98,&&&/* Encapsulation Header.
#define IPPROTO_ENCAP&&&&&&&&IPPROTO_ENCAP
&&&&IPPROTO_PIM = 103,&&&&/* Protocol Independent Multicast.
#define IPPROTO_PIM&&&&&&&&IPPROTO_PIM
&&&&IPPROTO_COMP = 108,&&&/* Compression Header Protocol.
#define IPPROTO_COMP&&&&&&&&IPPROTO_COMP
&&&&IPPROTO_SCTP = 132,&&&/* Stream Control Transmission Protocol.
#define IPPROTO_SCTP&&&&&&&&IPPROTO_SCTP
&&&&IPPROTO_UDPLITE = 136,&/* UDP-Lite protocol.
#define IPPROTO_UDPLITE&&&&&&&&IPPROTO_UDPLITE
&&&&IPPROTO_RAW = 255,&&&&
/* Raw IP packets.
#define IPPROTO_RAW&&&&&&&&IPPROTO_RAW
&&&&IPPROTO_MAX};很显然,上面的代码定义了所以基于IP协议的一些协议的枚举。其中为我们大多数人熟知的协议如下:1. & &IPPROTO_ICMP = 1,
& /* Internet Control Message Protocol. &*/& & & 该协议简写为ICMP,即Internet控制报文协议,著名的ping命令就是利用该协议来实现的。2.& & IPPROTO_TCP = 6,
& /* Transmission Control Protocol. &*/& & & &TCP协议,即传输层控制协议。3.& & IPPROTO_UDP = 17,
& /* User Datagram Protocol. &*/& & & &UDP协议,即用户数据报协议。4.& & IPPROTO_MTP = 92,
& /* Multicast Transport Protocol. &*/& & & &多播传输协议。还有它们对应的IPv6的协议。/* Type to represent a port.
typedef uint16_t in_port_t;
/* Standard well-known ports.
&&&&IPPORT_ECHO = 7,& & & & & &/* Echo service.
&&&&IPPORT_DISCARD = 9,&&&&&&&&/* Discard transmissions service.
&&&&IPPORT_SYSTAT = 11,&&&&&&&&/* System status service.
&&&&IPPORT_DAYTIME = 13,& & & &/* Time of day service.
&&&&IPPORT_NETSTAT = 15,& & & &/* Network status service.
&&&&IPPORT_FTP = 21,& & & & & &/* File Transfer Protocol.
&&&&IPPORT_TELNET = 23,&&&&&&&&/* Telnet protocol.
&&&&IPPORT_SMTP = 25,& & & & &&/* Simple Mail Transfer Protocol.
&&&&IPPORT_TIMESERVER = 37,&&&&/* Timeserver service.
&&&&IPPORT_NAMESERVER = 42,&&&&/* Domain Name Service.
&&&&IPPORT_WHOIS = 43,& & & & &/* Internet Whois service.
&&&&IPPORT_MTP = 57,
&&&&IPPORT_TFTP = 69,& & & & &&/* Trivial File Transfer Protocol.
&&&&IPPORT_RJE = 77,
&&&&IPPORT_FINGER = 79,&&&&&&&&/* Finger service.
&&&&IPPORT_TTYLINK = 87,
&&&&IPPORT_SUPDUP = 95,&&&&&&&&/* SUPDUP protocol.
&&&&IPPORT_EXECSERVER = 512,&&&&/* execd service.
&&&&IPPORT_LOGINSERVER = 513,&&&/* rlogind service.
&&&&IPPORT_CMDSERVER = 514,
&&&&IPPORT_EFSSERVER = 520,
&&&&/* UDP ports.
&&&&IPPORT_BIFFUDP = 512,
&&&&IPPORT_WHOSERVER = 513,
&&&&IPPORT_ROUTESERVER = 520,
&&&&/* Ports less than this value are reserved for privileged processes.
&&&&IPPORT_RESERVED = 1024,
&&&&/* Ports greater this value are reserved for (non-privileged) servers.
&&&&IPPORT_USERRESERVED = 5000};typedef uint16_t in_port_t;定义了端口为一个16位的无符号整数。接下来的enum定义了一些系统常用的端口号。& & IPPORT_NETSTAT = 15, & & & &/* Network status service. &*/ &提供netstat命令行服务的端口号& & IPPORT_FTP = 21,
& & &&&/* File Transfer Protocol. &*/ &FTP使用的端口号& & IPPORT_TELNET = 23, & & & & & & & /* Telnet protocol. &*/ &提供telent命令行服务的端口号& & IPPORT_SMTP = 25,
& & & &/* Simple Mail Transfer Protocol. &*/ 简单邮件协议的端口号& & IPPORT_NAMESERVER = 42, & &&/* Domain Name Service. &*/ &DNS的端口号& & /* Ports less than this value are reserved for privileged processes. &*/& & IPPORT_RESERVED = 1024,所以小于1024的端口号是系统预用的端口号。/* Internet address.
typedef uint32_t in_addr_t;
struct in_addr{
&&&&in_addr_t s_addr;};上面的结构定义了IP地址,为一个32位的无符号整数。/* Definitions of the bits in an Internet address integer.
&&&On subnets, host and network parts are found according to
&&&the subnet mask, not these masks.&*/
#define&&&&IN_CLASSA(a)&&&&&&&&((((in_addr_t)(a)) & 0x) == 0)
#define&&&&IN_CLASSA_NET&&&&&&&&0xff000000
#define&&&&IN_CLASSA_NSHIFT&&&&24
#define&&&&IN_CLASSA_HOST&&&&&&&&(0xffffffff & ~IN_CLASSA_NET)
#define&&&&IN_CLASSA_MAX&&&&&&&&128
#define&&&&IN_CLASSB(a)&&&&&&&&((((in_addr_t)(a)) & 0xc0000000) == 0x)
#define&&&&IN_CLASSB_NET&&&&&&&&0xffff0000
#define&&&&IN_CLASSB_NSHIFT&&&&16
#define&&&&IN_CLASSB_HOST&&&&&&&&(0xffffffff & ~IN_CLASSB_NET)
#define&&&&IN_CLASSB_MAX&&&&&&&&65536
#define&&&&IN_CLASSC(a)&&&&&&&&((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
#define&&&&IN_CLASSC_NET&&&&&&&&0xffffff00
#define&&&&IN_CLASSC_NSHIFT&&&&8
#define&&&&IN_CLASSC_HOST&&&&&&&&(0xffffffff & ~IN_CLASSC_NET)
#define&&&&IN_CLASSD(a)&&&&&&&&((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
#define&&&&IN_MULTICAST(a)&&&&&&&&IN_CLASSD(a)
#define&&&&IN_EXPERIMENTAL(a)&&&&((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
#define&&&&IN_BADCLASS(a)&&&&&&&&((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
/* Address to accept any incoming messages.
#define&&&&INADDR_ANY&&&&&&&&((in_addr_t) 0x)
/* Address to send to all hosts.
#define&&&&INADDR_BROADCAST&&&&((in_addr_t) 0xffffffff)
/* Address indicating an error return.
#define&&&&INADDR_NONE&&&&&&&&((in_addr_t) 0xffffffff)
/* Network number for local host loopback.
#define&&&&IN_LOOPBACKNET&&&&&&&&127
/* Address to loopback in software to local host.
#ifndef INADDR_LOOPBACK
# define INADDR_LOOPBACK&&&&((in_addr_t) 0x7f000001) /* Inet 127.0.0.1.
/* Defines for Multicast INADDR.
#define INADDR_UNSPEC_GROUP&&&&((in_addr_t) 0xe0000000) /* 224.0.0.0 */
#define INADDR_ALLHOSTS_GROUP&&&&((in_addr_t) 0xe0000001) /* 224.0.0.1 */
#define INADDR_ALLRTRS_GROUP
((in_addr_t) 0xe0000002) /* 224.0.0.2 */
#define INADDR_MAX_LOCAL_GROUP
((in_addr_t) 0xe00000ff) /* 224.0.0.255 */#define IN_CLASSA(a)& && & & & &((((in_addr_t)(a))&&&0x)&==&0)#define IN_CLASSB(a)
((((in_addr_t)(a)) & 0xc0000000) == 0x)#define IN_CLASSC(a)
((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)#define IN_CLASSD(a)
((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)#define IN_EXPERIMENTAL(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)#define IN_BADCLASS(a)
((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)该宏用于判断一个IP地址是否是一个A类地址,因为我们知道:A类地址的最高位为:0B类地址的最高位为:10C类地址的最高位为:110D类地址的最高位为:1110这几个宏分别:提起IP地址的最高1位,如果最高位是0,则是A类IP地址提起IP地址的最高2位,如果最高2位是10,则是B类IP地址提起IP地址的最高3位,如果最高3位是110,则是C类IP地址提起IP地址的最高4位,如果最高4位是1110,则是D类IP地址#define IN_CLASSA_NET
0xff000000用于提起A类IP地址的网络地址部分。#define IN_CLASSA_NSHIFT 24定义了A类IP地址的网络地址部分开始的偏移为24.(24--31位)#define IN_CLASSA_HOST
(0xffffffff & ~IN_CLASSA_NET)用于提起A类IP地址的主机地址部分。#define IN_CLASSA_MAX
128定义了A类IP地址允许有128个子网(2的7次方等于128)。其他关于B、C、D类地址的相关定义类似。/* Address to accept any incoming messages. &*/#define INADDR_ANY
((in_addr_t) 0x)该宏定义的IP地址可以接收所有发送过来的数据包。/* Address to send to all hosts. &*/#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)该宏定义了“有限广播地址”或者称为“本地网广播地址”,它用于在本地子网中进行广播。因为它的32位全部为1,所以它不可能去表示一个IP地址的网络地址部分,所以它只能用于本地子网进行广播。我们还有另外一种广播形式成为“定向广播”,它由某个Internate子网的网络部分加上全1的主机地址组成,可以用于定向向该Internate子网中的所有的主机进行广播,因为它可以指定向某个子网进行广播,所以叫“定向广播”。/* Network number for local host loopback. &*/#define IN_LOOPBACKNET
127定义了本地回网的网络地址部分。/* Address to loopback in software to local host. &*/#ifndef INADDR_LOOPBACK# define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) /* Inet 127.0.0.1. &*/#endif定义了本地回网的IP地址。/* Defines for Multicast INADDR. &*/#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000) /* 224.0.0.0 */#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001) /* 224.0.0.1 */#define INADDR_ALLRTRS_GROUP & &((in_addr_t) 0xe0000002) /* 224.0.0.2 */#define INADDR_MAX_LOCAL_GROUP &((in_addr_t) 0xe00000ff) /* 224.0.0.255 */这些宏定义了相关的组播地址。#define INET_ADDRSTRLEN 16#define INET6_ADDRSTRLEN 46定义了IPv4的IP地址的长度为16个字节,IPv6的IP地址长度为46字节。/* Structure describing an Internet socket address.
struct sockaddr_in
&&&&__SOCKADDR_COMMON (sin_);
&&&&in_port_t sin_port;& & & & & & &/* Port number.
&&&&struct in_addr sin_addr;&&&&&&&&/* Internet address.
&&&&/* Pad to size of `struct sockaddr'.
&&&&unsigned char sin_zero[sizeof (struct sockaddr) -
&&&&&&&&&&&&
__SOCKADDR_COMMON_SIZE -
&&&&&&&&&&&&
sizeof (in_port_t) -
&&&&&&&&&&&&
sizeof (struct in_addr)];
};定义了表示IP地址的结构体。显然该结构体的大小和struct sockaddr的大小一样。/* IPv4 multicast request.
struct ip_mreq
&&&&/* IP multicast address of group.
&&&&struct in_addr imr_multiaddr;
&&&&/* Local IP address of interface.
&&&&struct in_addr imr_interface;
struct ip_mreq_source
&&&&/* IP multicast address of group.
&&&&struct in_addr imr_multiaddr;
&&&&/* IP address of source.
&&&&struct in_addr imr_interface;
&&&&/* IP address of interface.
&&&&struct in_addr imr_sourceaddr;
};定义了组播相关的结构体。
阅读(3415) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 netinet ip var.h 的文章

 

随机推荐