中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 请教大虾,dos发icmp包时,SOKET用什么参数
作者:
标题: 请教大虾,dos发icmp包时,SOKET用什么参数 上一主题 | 下一主题
tobb133
新手上路





积分 18
发帖 9
注册 2008-9-16
状态 离线
『楼 主』:  请教大虾,dos发icmp包时,SOKET用什么参数

//dos下的ping.c //网络是pctcp,开发工具borlandc 3.1 //问题是:1,dos发icmp包时,SOKET用什么参数,否则recvfrom不能接受到回复包 //问题是:2,谁有更好的方法,请和我联系,toter@163.com //全部源码如下,请教高手。。。 /*所用的lib包 sconfig.lib snetlib.lib spc.lib ssocket.lib */ #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <netdb.h> #include <process.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/ioctl.h> #include <netinet\in.h> typedef int INT; typedef unsigned int UINT; typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef unsigned long ULONG; typedef unsigned short USHORT; typedef unsigned char UCHAR; typedef char *PSZ; #define PORT 1000 /* the port client will be connecting to */ #define ServerIP "192.168.1.43" #define ICMP_ECHO 8 #define MAX_PACKET 1024 // Max ICMP packet size typedef struct _iphdr { unsigned int h_len:4; // Length of the header unsigned int version:4; // Version of IP unsigned char tos; // Type of service unsigned short total_len; // Total length of the packet unsigned short ident; // Unique identifier unsigned short frag_and_flags; // Flags unsigned char ttl; // Time to live unsigned char proto; // Protocol (TCP, UDP etc) unsigned short checksum; // IP checksum unsigned int sourceIP; unsigned int destIP; } IpHeader; typedef struct _icmphdr { BYTE i_type; BYTE i_code; // Type sub code USHORT i_cksum; USHORT i_id; USHORT i_seq; // This is not the standard header, but we reserve space for time ULONG timestamp; } IcmpHeader; // // IP option header - use with socket option IP_OPTIONS // typedef struct _ipoptionhdr { unsigned char code; // Option type unsigned char len; // Length of option hdr unsigned char ptr; // Offset into options unsigned long addr[9]; // List of IP addrs } IpOptionHeader; void FillICMPData(char *icmp_data, int datasize) { IcmpHeader *icmp_hdr = NULL; char *datapart = NULL; icmp_hdr = (IcmpHeader*)icmp_data; icmp_hdr->i_type = ICMP_ECHO; // Request an ICMP echo icmp_hdr->i_code = 0; icmp_hdr->i_id = (USHORT)getpid(); icmp_hdr->i_cksum = 0; icmp_hdr->i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader); } //puclic code //网际校验和生产算法 //网际校验和是被校验数据16位值的反码和(ones-complement sum) unsigned short in_cksum(unsigned short* addr, int len) { int nleft = len; int sum = 0; unsigned short* w = addr; unsigned short answer = 0; while(nleft > 1) { sum += *w++; nleft -= 2; } if(nleft == 1) { *(unsigned char*)(&answer) = *(unsigned char*)w; sum += answer; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return (answer); } main() { int sockfd; int iSendSize; struct sockaddr_in dest,from; char icmp_data[MAX_PACKET]; int datasize,ret,tmp; USHORT seq_no ; int fromlen; int iRecvSize; IpOptionHeader m_ipopt; char recv_buffer[MAX_PACKET]; long last_time, now, timeout = 15L; if((sockfd=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP))<0)//这里不知道用在dos下用什么参数 //if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)//dos下的upd通讯连接方式 { printf("socket() failed\n"); exit(1); } dest.sin_family =AF_INET; //server.sin_port =htons( PORT ); dest.sin_addr.s_addr = inet_addr(ServerIP); // Create the ICMP packet datasize += sizeof(IcmpHeader); memset(icmp_data,0,MAX_PACKET); FillICMPData(icmp_data,datasize); ((IcmpHeader*)icmp_data)->i_cksum = 0; ((IcmpHeader*)icmp_data)->timestamp = (unsigned long)time(NULL); ((IcmpHeader*)icmp_data)->i_seq = seq_no++; ((IcmpHeader*)icmp_data)->i_cksum = in_cksum((unsigned short*)icmp_data, sizeof(IcmpHeader) + datasize); iSendSize= sendto(sockfd, icmp_data,1024,0, (struct sockaddr*)&dest, sizeof(dest)) ; if (iSendSize< 0 ) { printf("icmp sendto 192.168.1.43 failed\n"); close(sockfd); exit(2); } printf("发送的数据 %d \n",iSendSize); fprintf(stdout, "Reply...\r\n"); memset(&from, 0, sizeof from); memset(recv_buffer, 0, 1024); fromlen = sizeof(from); iRecvSize = recvfrom(sockfd, recv_buffer, 1024, 0, (struct sockaddr*)&from, &fromlen); if (iRecvSize > 0){ printf("recvfrom 192.168.1.43 success\n"); }else { printf("recvfrom 192.168.1.43 failed\n"); } close(sockfd); return 1; }


2008-12-18 17:27
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: