标题:运行完,没有结果,这是什么原因?
只看楼主
初学者6
Rank: 2
等 级:论坛游民
帖 子:34
专家分:20
注 册:2016-12-30
结帖率:66.67%
已结贴  问题点数:20 回复次数:3 
运行完,没有结果,这是什么原因?
运行之后,是这样的:

没有结果,这是什么原因?
代码如下:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")  
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_SIZE 65535
//定义IP头部数据结构
typedef struct _IP_HEADER //定义IP头
{
   union
   {
       BYTE Version;    //版本(前四位)
       BYTE HdrLen;    //报头标长(后四位),IP头长度
    };
    BYTE ServiceType;    //服务类型
    WORD TotalLen;     //总长度
    WORD ID;         //标志
    union
    {
       WORD Flags;  //标识(前3位)
       WORD FragOff;  //分段偏移(后13位)
    };
    BYTE TimeToLive;    //生存时间
    BYTE Protocol;     //协议
    WORD HdrChksum;    //首部检验和
    DWORD SrcAddr;      //源地址
    DWORD DstAddr;      //目的地址
    BYTE Options;
}IP_HEADER;
//逐位解析IP头中的信息,获取版本号

void getVersion(BYTE b, BYTE & version)
{
  version=b>>4;  //右移运算         
}  

void getIHL(BYTE b,BYTE & result)
{
  result=(b&0x0f)*4;
}
//解析服务类型
char * parseServiceType_getProcedence(BYTE b)
{
    switch (b>>5)
    {
        case 7:
            return "Network Control";//网络控制
            break;
        case 6:   
            return "Internet work Control";//网络控制
            break;      
        case 5:
            return "CRITIC/ECP";
            break;
        case 4:
            return "Flash Override";  //最优先信号
            break;
        case 3:
            return "Flsah";
            break;
        case 2:  
            return "Immediate";               
            break;
        case 1:  
            return "Priority"; //协议  
            break;
        case 0:   
            return "Routine";  //路由        
            break;
        default:  
            return "Unknow";  
            break;
    }
}  

char * parseServiceType_getTOS(BYTE b)
{
    b=(b>>1)&0x0f;
    switch(b)
    {
        case 0:
            return "Normal service"; //正常运行      
            break;
        case 1:
            return "Minimize monetary cost";  //成本   
            break;  
        case 2:  
            return "Maximize reliability"; //可靠性     
            break;  
        case 4:
            return "Maximize throughput"; //吞吐量         
            break;
        case 8:  
            return "Minimize delay";  //延迟
            break;
        case 15:  
            return "Maximize security"; //安全性      
            break;            
        default:  
            return "Unknow";
    }
}
//获取禁止分片标志和分片标志
void getFlags(WORD w,BYTE & DF,BYTE & MF)
{
    DF=(w>>14)&0x01;  
    MF=(w>>13)&0x01;
}

// 获取分片偏移量
void getFragOff(WORD w,WORD & fragOff)           
{
    fragOff=w&0x1fff;
}  
//获取协议
char * getProtocol(BYTE Protocol) //获取协议字段共8位            
{
    switch(Protocol)   //以下为协议号说明                        
    {
        case 1:        
            return "ICMP"; //Internet控制报文协议  
        case 2:         
            return "IGMP";  //Internet组管理协议
        case 4:            
            return "IP in IP"; //移动IP数据封装和隧道
        case 6:           
            return "TCP"; //传输控制协议
        case 8:         
            return "EGP"; //外部网关协议
        case 17:
            return "UDP";  //用户数据报文协议            
        case 41:
            return "IPv6";  
        case 46:
            return "RSVP";  //资源预留协议
        case 89:
            return "OSPF";  //Open Shortest Path First开发式最短路径优先
        default:
            return "UNKNOW";
    }
}  
// 解析IP数据包  
void ipparse(FILE* file,char* buffer)
{
    IP_HEADER ip=*(IP_HEADER*)buffer;
    fseek(file,0,SEEK_END);
    BYTE version;
    getVersion(ip.Version,version);
    fprintf(file,"版本号:IPv%d\r\n",version);
    BYTE headerLen;
    getIHL(ip.HdrLen,headerLen);
    fprintf(file,"报头标长=%d(BYTE)\r\n",headerLen);
    fprintf(file,"服务器类型=%s,%s\r\n",
    parseServiceType_getProcedence(ip.ServiceType),
    parseServiceType_getTOS(ip.ServiceType));
    fprintf(file,"总长度=%d(BYTE)\r\n",ip.TotalLen);
    fprintf(file,"标识=%d\r\n",ip.ID);
    BYTE DF,MF;
    getFlags(ip.Flags,DF,MF);
    fprintf(file,"标志 DF=%d,MF=%d\r\n",DF,MF);
    WORD fragOff;
    getFragOff(ip.FragOff,fragOff);
    fprintf(file,"分段偏移值=%d\r\n",fragOff);
    fprintf(file,"生存期=%d(hopes)\r\n",ip.TimeToLive);  
    fprintf(file,"协议=%s\r\n",getProtocol(ip.Protocol));  
    fprintf(file,"头校验和=0x%0x\r\n",ip.HdrChksum);
    fprintf(file,"源IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));
    fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));
    fprintf(file,"*****************************************\r\n");
}  
//主程序开始
int main()
{
    int nRetCode=0;
    {
        FILE * file;
        if((file=fopen("history.txt","wb+"))==NULL)
        {
            printf("fail to open file %s");
            return -1;
        }
        WSADATA wsData;/* 启动2.2版本的Socket,并将Socket版本信息保存到wsData中 */
        WSAStartup(MAKEWORD(2,2),&wsData);
        SOCKET sock;/* 创建原始套接字 */
        sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
        BOOL flag=TRUE;/* 设置IP头操作选项 */
        setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));
        char hostName[128];/* 获取本地主机名 */
        gethostname(hostName,100);

        hostent * pHostIP;/* 根据主机名获取主机信息 */
        pHostIP=gethostbyname(hostName);   /* 封装IP地址信息 */
        sockaddr_in addr_in;
        addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];
        addr_in.sin_family=AF_INET;
        addr_in.sin_port=htons(6000);
        bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));  
   
        DWORD dwValue=1;
        DWORD dwBufferLen[10];
        DWORD dwBufferInLen=1;
        DWORD dwBytesReturned=0;
        WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),
            &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);

        char buffer[BUFFER_SIZE];
        printf("请输入命令符ParsePacket开始抓包!\n");
        char a[20];
        gets(a);
        if(strcmp(a,"ParsePacket")==0)
        {
            printf("开始解析经过本机的IP数据包,请耐心等待,如果没反应,可能网络未连接,解析较慢!\n");
            while(true)
            {
                int size=recv(sock,buffer,BUFFER_SIZE,0);
                if (size>0)
                {
                    printf("\n\nIP数据包捕获解析程序\n");
                    ipparse(stdout,buffer);
                    ipparse(file,buffer);
                    printf("请选择是否继续(1:继续;2:退出)?\n");
                    char b[20];
                    gets(b);
                    if(strcmp(b,"1")==0)
                    {
                        ipparse(stdout,buffer);
                        ipparse(file,buffer);
                    }
                    else
                    {
                        return 0;
                    }
                }
            }
            fclose(file);
            return 0;
        }
        else
        {
            printf("您的输入有误,请退出后重新打开本程序!\n");
            system("pause");
        }
    }
    return nRetCode;
}
搜索更多相关主题的帖子: IP BYTE case return FILE 
2017-06-24 14:35
beichei5d
Rank: 4
等 级:业余侠客
威 望:2
帖 子:89
专家分:270
注 册:2016-3-8
得分:10 
病毒 ?

你现在所偷的懒,都将成为以后扇你的巴掌!共勉吧。。。
2017-06-24 16:43
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
这显然有两种可能呗
比如 sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); 等等,你也不知道它执行成功与否,如果失败了那没话讲;
第二,可能你本机就是没有IP数据包,没有的话那当然只能干等了
2017-06-26 09:19
luckm
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2018-12-28
得分:0 
在我电脑上显示有错误
2018-12-28 13:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-478905-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.299747 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved