2301_81286386 2024-09-09 10:12 采纳率: 50%
浏览 8
已结题

VS 2022中无法将参数1转换

请问各位怎么处理
严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息
错误 C2664 “tm *localtime(const time_t *const )”: 无法将参数 1 从“const long *”转换为“const time_t *const ” Project1 E:\VS 2022 项目\Project1\Project1\解析ARP数据包.cpp 146

#include<Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")      //使用ntohs()函数,转换2B/4B的数据
#pragma comment(lib, "wpcap.lib")
#include"pcap.h"                        //需要另外导入,具体步骤见Winpcap使用说明
#include<fstream>
#include<iostream>                      //格式化输出
#include<iomanip>
using namespace std;             
#include<conio.h>                       //使用_getch()
struct arppkt {
    unsigned short hdtyp;              //硬件地址
    unsigned short protyp;             //协议类型
    unsigned char hdsize;              //硬件地址长度
    unsigned char prosize;             //协议地址长度
    unsigned short op;                 //操作值
    u_char smac[6];                    //源MAC地址
    u_char sip[4];                     //源IP地址
    u_char dmac[6];                    //目的MAC地址
    u_char dip[4];                     //目的IP地址
};
//自定义处理包函数
//pcap_pkthdr是winpcap加入的
//pkt_data表示MAC帧的起始位置
//out是输入流
void packet_handler(const pcap_pkthdr* header, const u_char* pkt_data, ostream&);
void main(int argc, char* argv[])
{
    if (argc != 2)
    {
        cout << "usage:ARPCap logfilename" << endl;
        cout << "press anykey to continue." << endl;     //参数不对,进行提示
        _getch();
        return;
    }
    pcap_if_t* alldevs;                               //网络设备结构
    pcap_if_t* d;
    pcap_t* adhandle;
    char errbuf[PCAP_ERRBUF_SIZE];                  //错误信息
    u_int netmask;                                    //子网掩码
    char packet_filter[] = "ether proto \\arp";       //过滤,选择ARP协议
    struct bpf_program fcode;
    struct pcap_pkthdr* header;
    const u_char* pkt_data;
    //获取网络设备列表
    if (pcap_findalldevs(&alldevs, errbuf) == -1)
    {
        cout << "Error in pcap_findalldevs:" << errbuf;
        return;
    }
    //选择一个Ethernetka卡
    for (d = alldevs; d; d = d->next)
    {
        //以混杂模式打开网卡,接受所有的帧
        if ((adhandle = pcap_open_live(d->name, 1000, 1, 300, errbuf)) == NULL)
        {
            cout << "\nUnable to open the adapter.";
            pcap_freealldevs(alldevs);              //释放设备列表      
            return;
        }
        if (pcap_datalink(adhandle) == DLT_EN10MB && d->addresses != NULL)
            break;
    }
    if (d == NULL)
    {
        cout << "\nNO interfaces found! Make sure winpcap is installed.\n";
        return;
    }
    //获得子网掩码
    netmask = ((sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr;
    //调试过滤器,只捕获ARP包
    if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0)
    {
        cout << "\nUnable to compile the packet filter. Check the syntax.\n";
        pcap_freealldevs(alldevs);
        return;
    }
    //设置过滤器
    if (pcap_setfilter(adhandle, &fcode) < 0)
    {
        cout << "\nError setting the filter.\n";
        pcap_freealldevs(alldevs);
        return;
    }
    cout << "\t\tlistening on " << d->description << "..." << endl << endl;
    ofstream fout(argv[1], ios::app);                  //日志记录文件
    //加入日期记录
    time_t t;
    time(&t);
    fout.seekp(0, ios::end);
    if (fout.tellp() != 0)
        fout << endl;
    fout << "\t\tARP request(1)/replay(2) on " << ctime(&t);
    cout << "sour IP Addr" << "   " << "Sour MAC Address"
        << "   " << "Des IP Addr" << "   " << "Des MAC Address"
        << "   " << "OP" << "   " << "Time" << endl;
    fout << "Sour IP Addr" << "  " << "Sour MAC Address"
        << "  " << "Des IP Addr" << "  " << "Des MAC Address"
        << "  " << "OP" << "  " << "Time" << endl;
    //释放设备列表
    pcap_freealldevs(alldevs);
    //开始捕获MAC帧
    int result;                                 //时间到返回结果
    while ((result = pcap_next_ex(adhandle, &header, &pkt_data)) >= 0)
    {
        if (result == 0)
            continue;
        packet_handler(header, pkt_data, cout);   //解析ARP包,输出结果
        packet_handler(header, pkt_data, fout);   //输出到文件
    }
}
void packet_handler(const pcap_pkthdr* header, const u_char* pkt_data, ostream& out)
{
    int i;
    //从截获的数据帧中找到arp包头的位置
    arppkt* arph = (arppkt*)(pkt_data + 14);    //14为Ethernet帧头的长度
    //输出源IP地址
    for (i = 0; i < 3; i++)
        out << int(arph->sip[i]) << '.';
    out.setf(ios::left);
    out << setw(3) << int(arph->sip[3]) << "  ";
    out.unsetf(ios::left);
    //输出源MAC地址
    char oldfillchar = out.fill('0');
    out.setf(ios::uppercase);       //MAC地址以分开'-'的大写字符表示
    for (i = 0; i < 5; i++)
        out << hex << setw(2) << int(arph->smac[i]) << '_';
    out << hex << setw(2) << int(arph->smac[5]) << "  ";
    out.fill(oldfillchar);
    //输出目的的IP地址
    out.unsetf(ios::hex | ios::uppercase);
    for (i = 0; i < 3; i++)
        out << int(arph->dip[i]) << '.';
    out.setf(ios::left);
    out << setw(3) << int(arph->dip[3]) << " ";
    out.unsetf(ios::left);
    //输出目的MAC地址
    out.fill('0');
    out.setf(ios::uppercase);
    for (i = 0; i < 5; i++)
        out << hex << setw(2) << int(arph->dmac[i]) << '_';
    out << hex << setw(2) << int(arph->dmac[5]) << "  ";
    out.fill(oldfillchar);
    out.unsetf(ios::hex | ios::uppercase);
    out << ntohs(arph->op) << " ";                
struct tm* ltime;                              //时间
    ltime = localtime(&header->ts.tv_sec);
    out.fill('0');
    out << ltime->tm_hour << ':' << setw(2) << ltime->tm_min << ':' << setw(2) << ltime->tm_sec;
    out.fill(oldfillchar);
    out << endl;
}
  • 写回答

5条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-09-09 14:31
    关注

    🕒下午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:何须剑道争锋?千人指,万人封;可问江湖顶峰,三尺秋水尘不染,天下无双。

    你遇到的错误是“无法将参数 1 从“const long *”转换为“const time_t *const ””,这是因为你在使用 localtime 函数时,传入的参数类型不匹配。localtime 函数需要一个指向 time_t 类型的指针,而你传入的是一个指向 long 类型的指针。

    这个问题出现在以下代码行:

    ltime = localtime(&header->ts.tv_sec);
    

    header->ts.tv_sec 的类型是 long,你需要将其转换为 time_t 类型。

    以下是修改后的代码片段:

    // ... 其他代码 ...
    
    // 将 long 类型的 tv_sec 转换为 time_t 类型
    time_t timestamp = static_cast<time_t>(header->ts.tv_sec); 
    
    // 使用转换后的时间戳调用 localtime 函数
    struct tm* ltime = localtime(&timestamp);
    
    // ... 其他代码 ...
    

    通过将 header->ts.tv_sec 显式转换为 time_t 类型,你可以解决这个编译错误。

    以下是完整的代码,包含修改后的部分:

    #include<Winsock2.h>
    #pragma comment(lib, "Ws2_32.lib")      //使用ntohs()函数,转换2B/4B的数据
    #pragma comment(lib, "wpcap.lib")
    #include"pcap.h"                        //需要另外导入,具体步骤见Winpcap使用说明
    #include<fstream>
    #include<iostream>                      //格式化输出
    #include<iomanip>
    using namespace std;
    #include<conio.h>                       //使用_getch()
    
    struct arppkt {
        unsigned short hdtyp;              //硬件地址
        unsigned short protyp;             //协议类型
        unsigned char hdsize;              //硬件地址长度
        unsigned char prosize;             //协议地址长度
        unsigned short op;                 //操作值
        u_char smac[6];                    //源MAC地址
        u_char sip[4];                     //源IP地址
        u_char dmac[6];                    //目的MAC地址
        u_char dip[4];                     //目的IP地址
    };
    
    //自定义处理包函数
    //pcap_pkthdr是winpcap加入的
    //pkt_data表示MAC帧的起始位置
    //out是输入流
    void packet_handler(const pcap_pkthdr* header, const u_char* pkt_data, ostream& out);
    
    void main(int argc, char* argv[]) {
        if (argc != 2) {
            cout << "usage:ARPCap logfilename" << endl;
            cout << "press anykey to continue." << endl;     //参数不对,进行提示
            _getch();
            return;
        }
        pcap_if_t* alldevs;                               //网络设备结构
        pcap_if_t* d;
        pcap_t* adhandle;
        char errbuf[PCAP_ERRBUF_SIZE];                  //错误信息
        u_int netmask;                                    //子网掩码
        char packet_filter[] = "ether proto \\arp";       //过滤,选择ARP协议
        struct bpf_program fcode;
        struct pcap_pkthdr* header;
        const u_char* pkt_data;
        //获取网络设备列表
        if (pcap_findalldevs(&alldevs, errbuf) == -1) {
            cout << "Error in pcap_findalldevs:" << errbuf;
            return;
        }
        //选择一个Ethernetka卡
        for (d = alldevs; d; d = d->next) {
            //以混杂模式打开网卡,接受所有的帧
            if ((adhandle = pcap_open_live(d->name, 1000, 1, 300, errbuf)) == NULL) {
                cout << "\nUnable to open the adapter.";
                pcap_freealldevs(alldevs);              //释放设备列表                  
                return;
            }
            if (pcap_datalink(adhandle) == DLT_EN10MB && d->addresses != NULL)
                break;
        }
        if (d == NULL) {
            cout << "\nNO interfaces found! Make sure winpcap is installed.\n";
            return;
        }
        //获得子网掩码
        netmask = ((sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr;
        //调试过滤器,只捕获ARP包
        if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0) {
            cout << "\nUnable to compile the packet filter. Check the syntax.\n";
            pcap_freealldevs(alldevs);
            return;
        }
        //设置过滤器
        if (pcap_setfilter(adhandle, &fcode) < 0) {
            cout << "\nError setting the filter.\n";
            pcap_freealldevs(alldevs);
            return;
        }
        cout << "\t\tlistening on " << d->description << "..." << endl << endl;
        ofstream fout(argv[1], ios::app);                  //日志记录文件
        //加入日期记录
        time_t t;
        time(&t);
        fout.seekp(0, ios::end);
        if (fout.tellp() != 0)
            fout << endl;
        fout << "\t\tARP request(1)/replay(2) on " << ctime(&t);
        cout << "sour IP Addr" << "   " << "Sour MAC Address"
            << "   " << "Des IP Addr" << "   " << "Des MAC Address"
            << "   " << "OP" << "   " << "Time" << endl;
        fout << "Sour IP Addr" << "  " << "Sour MAC Address"
            << "  " << "Des IP Addr" << "  " << "Des MAC Address"
            << "  " << "OP" << "  " << "Time" << endl;
        //释放设备列表
        pcap_freealldevs(alldevs);
        //开始捕获MAC帧
        int result;                                 //时间到返回结果
        while ((result = pcap_next_ex(adhandle, &header, &pkt_data)) >= 0) {
            if (result == 0)
                continue;
            packet_handler(header, pkt_data, cout);   //解析ARP包,输出结果
            packet_handler(header, pkt_data, fout);   //输出到文件
        }
    }
    
    void packet_handler(const pcap_pkthdr* header, const u_char* pkt_data, ostream& out) {
        int i;
        //从截获的数据帧中找到arp包头的位置
        arppkt* arph = (arppkt*)(pkt_data + 14);
        //14为Ethernet帧头的长度
        //输出源IP地址
        for (i = 0; i < 3; i++)
            out << int(arph->sip[i]) << '.';
        out.setf(ios::left);
        out << setw(3) << int(arph->sip[3]) << "  ";
        out.unsetf(ios::left);
        //输出源MAC地址
        char oldfillchar = out.fill('0');
        out.setf(ios::uppercase);       //MAC地址以分开'-'的大写字符表示
        for (i = 0; i < 5; i++)
            out << hex << setw(2) << int(arph->smac[i]) << '_';
        out << hex << setw(2) << int(arph->smac[5]) << "  ";
        out.fill(oldfillchar);
        //输出目的的IP地址
        out.unsetf(ios::hex | ios::uppercase);
        for (i = 0; i < 3; i++)
            out << int(arph->dip[i]) << '.';
        out.setf(ios::left);
        out << setw(3) << int(arph->dip[3]) << " ";
        out.unsetf(ios::left);
        //输出目的MAC地址
        out.fill('0');
        out.setf(ios::uppercase);
        for (i = 0; i < 5; i++)
            out << hex << setw(2) << int(arph->dmac[i]) << '_';
        out << hex << setw(2) << int(arph->dmac[5]) << "  ";
        out.fill(oldfillchar);
        out.unsetf(ios::hex | ios::uppercase);
        out << ntohs(arph->op) << " ";                
        // 将 long 类型的 tv_sec 转换为 time_t 类型
        time_t timestamp = static_cast<time_t>(header->ts.tv_sec);
    
        struct tm* ltime;                              //时间
        ltime = localtime(&timestamp);
        out.fill('0');
        out << ltime->tm_hour << ':' << setw(2) << ltime->tm_min << ':' << setw(2) << ltime->tm_sec;
        out.fill(oldfillchar);
        out << endl;
    }
    

    希望这个解决方案能够帮助你解决问题!如果还有其他问题,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月9日
  • 已采纳回答 9月9日
  • 赞助了问题酬金15元 9月9日
  • 创建了问题 9月9日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?