网络Ping命令设计PPT

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SOCKADDR结构的一样. };
在unsigned long 和点分十进制字符串之间转换IP地址的表示可以用下 边的函数: unsigned long inet_addr( const char FAR* cp); //cp为点分十进制字 符串
创建套接字
套接字是SOCKET类型. 创建套接字的函数是socket 和 WSASocket.
//首部长度 //ip版本号 //服务类型 // 总长度 //标识 //标志位 //生存时间 //协议(TCP或其他) //ip首部校验和 //源ip地址 //目的ip地址
unsigned char sendpacket[PACKET_SIZE]; unsigned char recvpacket[PACKET_SIZE]; struct sockaddr_in dest_addr; struct sockaddr_in from_addr; int sockfd; int pid; //函数声明 函数声明 unsigned short cal_chksum(unsigned short *addr,int len); int pack(int pack_no); int unpack(unsigned char *buf,int len); void send_packet(void); void recv_packet(void); //指明目的主机信息 //指明源主机信息
ቤተ መጻሕፍቲ ባይዱ
错误检查和处理
对Winsock函数来说返回错误是很常见的. 失败时最常见的返回值是 SOCKET_ERROR(值为-1).检查到错误后. 可以用 int WSAGetLastError(void);函数返回int. 这是在WINSOCK1.h或Winsock2.h中 定义的常量值.来获得一段代码专门说明错误. 与WSAGetLastError函数对应的有个WSASetLastError().它可以手动设置一个 错误代码让WSAGetLastError去获取. 例如以下的函数: //初始化winsock if(WSAStartup(0x1010,&wsaData)!=0) { printf("wsastartup error\n"); exit(1); } // 因为这个函数调用时Winsock还没有加载. 所以不能用WSAGetLastError()来 确定错误.
struct ip { unsigned char ip_hl:4; unsigned char ip_v:4; unsigned char ip_tos; unsigned short ip_len; unsigned short ip_id; unsigned short ip_off; unsigned char ip_ttl; unsigned char ip_p; unsigned short ip_sum; unsigned long ip_src; unsigned long ip_dst; };
SOCKET PASCAL FAR socket( int af, int type, int protocol); af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPAInternet地址 格式。 type:新套接口的类型描述。 protocol:套接口所用的协议。如调用者不想指定,可用0。
其中WSAData结构如下: typedef struct WSAData { WORD wVersion; //WSAAtartup函数会将这个字段设置为将要使 用 的Winsock版本. WORD wHighVersion; //现有Winsock库的最高版本. char szDescription[WSADESCRTIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets;//客同时打开的最大套接字数.取决与可用的 物理资源. unsigned short iMaxUdpDg; //数据报最大长度 char FAR* 1pVendorInfo; //保留字段 }WSADATA,*LPWSADATA ; 从windows98向后的平台都支持Winsock2.2版本. 但Windows CE支持的是 Winsock 1.1版本.如果WSAStartup()的第一个参数wVersionRequested 指定 的版本比当前平台上的最新版本还新.则函数就会失败. 在使用Winsock接口编程完成后.要int WSACleanup(void);来释放所有由 Winsock分配的资源.
将套接字和地址结构绑定 bind(s, (SOCKADDR*)&tcpaddr, sizeof(tcpaddr)); 注意第2个参数的类型有转换.这个函数如果出错会返回SOCKET_ERROR . 常见的错误是: WSAEADDRINUSE(表示本地这个端口和IP已被另一个进程 绑定). WSAEFAULT (表示该套接字s已被绑定过了)。 现在套接字已被绑定到本地一个端口上了. 接着要让他进入监听模式.使用函 数 listen:int listen(SOCKET s, int backlog); 其中: s是已被bind过的套接字. backlog则是指定被搁置的连接队列的最大长 度.当连接的客户数大于这里的最大长长度并且并且服务进程没有来得及处理. 则多出的连接请求会失败.这个函数相关的错误.常见的有 WSAEINVAL(套接 字在listen之前没有bind).
TCP客户端的状态: 每个套接字的初始状态都是CLOSED. 客户机初始化一个连接.向服务 器发出连接请求SYN包时(第1次握手).客户机套接字的状态为 SYN_SENT.然后客户机等待一个从服务器端返回的SYN_ACK包应答 (第2次握手).如果收不到这个SYN_ACK包. 客户机会超时.回到 CLOSED状态.如果收到. 则客户机再发送一个ACK包给服务器作为响 应(第3次握手).客户机套接字状态变为ESTABLISHED. TCP服务端的状态: 一开始套接字的初始状态都是CLOSED.套接字和本地接口(IP)端口绑 定之后(通过bind函数).再通过lesten函数进入侦听状态.这时服务器套 接字状态为 LISTEN. 当服务器收到客户机的连接请求时.要发送一个 SYN_ACK包回应客户机(第2次握手).这时状态为SYN_RCVD.然后客 户机再返回ACK包(第3次握手).服务器收到后.状态变为 ESTABLISHED.
SOCKET socket(int af, int type, int protocol);
其中: af是协议的地址族. 如IPv4对应的是 AF_INET,type是协议的套 接字类型.如果是 TCP/IP则是 SOCK_STREAM 。如果是UDP/IP则是 SOCK_DGRAM。protocol用于给定的地址和套接字类型具有多重入口 时.对具体的传送做限定.对于TCP应将该字段设为 IPPROTO_TCP 对 于UDP则设为 IPPROTO_UDP
struct icmp { unsigned char icmp_type; // 消息类型 unsigned char icmp_code; // 代码 unsigned short icmp_cksum; // 校验和 unsigned short icmp_id; // 用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_seq; // 序列号 unsigned long icmp_data; // 时间戳 };
winsock编程技术 简介
Winsock简介 - windows网络编程
Winsock是一种标准API. 主要用于网络通信.这些API函数有Winsock1 Winsock2版本. 通过前缀WSA区分. 1.1 Winsock头文件及库文件 使用Winsock2规范时 应包含winsock2.h 连接的库为 WS2_32.LIB使用 Winsock1规范时. 应包含winsock.h 连接的库为 WSOCK32.LIB另外 mswsock.h用于微软专用编程扩展. 连接的库为 MSWSOCK.DLL 1.2 Winsock的初始化 每个Winsock应用程序都必须加载合适的Winsock DLL版本. 函数如下 int WSAStartup { WORD wVersionRequested,LPWSADATA 1pWSAData, //指向WSAData结构(见下边)的指针. 本函数将填充这个结构 体. WORD wVersionRequested, LPWSADATA 1pWSAData );
#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<process.h> #include "winsock.h" #pragma comment(lib,"Ws2_32.lib");
#define SEND_SIZE 32 #define PACKET_SIZE 4096 #define ICMP_ECHO 8 #define ICMP_ECHOREPLY 0
1.创建套接字. 2. 建立SOCKADDR地址结构.(指定要连接到的服务器的IP地址和端口 号) 3. 用connect或WSAConnect初始化客户与服务器的连接. 其中.前两步和服务器端建立连接的一样. 第3步使用的函数如: int connect(SOCKET s, const struct sockaddr FAR* name, int namelen); 其中:s就是将要和服务器建立连接的套接字. name是服务器的地址结构 (SOCKADDR_IN). namelen是name的长度. 如果函数失败.一般返回的错误有:WSAECONNREFUSED 表示服务器 没有监听这个端口WSAETIMEDOUT 一般表示主机不可到达.
关闭套接字
int closesocket(SOCKET s);函数执行后.会释放套接字描述符.所以之 后对s的调用会失败(产生WSAENOTSOCK)错误.如果没有对s的其他 引用.那所有与s关联的资源都会被释放.包括丢弃所有队列中的数据.
ping程序原理
它主要的功能是用来检测网络的连通情况和分析网络速度。 Ping程序的实现方法是:主机向远程计算机发出ICMP回应 请求以后,远程计算机会处理这个请求,然后生成一条回应 应答消息,再通过网络传回给发送主机;假如由于某些原因 不能抵达目标主机,就会生成对应的ICMP错误消息由那个 路径上某处的一个路由器返回.如果是与远程主机的连接没 问题,只是远程主机已经关机,便需要由自己的程序来执行 超时检查.
//当应用程序结束调用WSACleanup之后,设置Winsock通信代码 if (WSACleanup() == SOCKET ERROR){ printf("WSACleanup fa工led with error %d \n", WSAGetLastError()); }
协议寻址
应用程序通过SOCKADDR_IN结构来指定IP地址和服务器端口信息: struct sockaddr_in { short sin_family; //设置为AF_INET表示Winsock正使用IP地址族 u_short sin_port; //通信端口 struct in_addr sin_addr; //这个字段用sin_addr(4字节) 保存IP地址 char sin_zero[8]; //这个字段是填充项.使这个结构体大小和
现在可以让服务器接受连接.使用函数accept,: SOCKETaccept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen); 其中 s是处于监听模式的套接字. addr是SOCKADDR_IN对象的地址. addrlen是第2个参数的长度.这个函数取出被搁置的连接队列中的第一 个连接请求.对它服务.函数执行后第2个参数和第3个参数指向的变量 会被函数设置为客户IPv4地址信息和该信息的长度. 并且.accept函数 返回一个新的套接字.对该客户的所有后续操作(如数据收发等)都用这 个新套接字来完成. 而原来的套接字s则继续处于监听模式.如果这个函 数出错.会返回 INVALID_SOCKET .
相关文档
最新文档