繁体   English   中英

使用原始数据包数据和inet_ntoa()进行转换

[英]Casting with raw packet data and inet_ntoa()

试图为数据包嗅探器编写处理程序。 我遇到了关于cast和inet_ntoa() 代码如下:

uint32_t *iphdr_srcaddr = malloc(sizeof(uint32_t));
if (*packet_ethertype == ETHERTYPE_IP) { /* IPv4 */
    // copy packet data to vars
    memcpy(iphdr_srcaddr, packet+26, 4);

    // change to host-byte-order
    *iphdr_srcaddr = ntohl(*iphdr_srcaddr);

    struct in_addr *test;
    test = (struct in_addr*) iphdr_srcaddr;

    printf("uint32_t: %u\n", *iphdr_srcaddr); // Gives the correct long integer for the address
    printf("struct in_addr: %u\n", test->s_addr); // Gives the correct long integer through the cast

    char *test2;
    test2 = inet_ntoa(*test);
}

现在,如果我尝试printf("%s\\n", test)我会得到SEGV。 我敢肯定我正在混淆指针,价值观和做某种愚蠢的演员。 运行期间收到错误:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff787ec61 in __strlen_sse2 () from /lib/libc.so.6

编译警告,我确信这指向了正确的方向,但我不确定它意味着什么以及如何解决它:

mypcap.c: In function ‘handle_sniffed’:
mypcap.c:61:15: warning: assignment makes pointer from integer without a cast [enabled by default]

这指的是行test2 = inet_ntoa(*test);

警告可能表示您在inet_ntoa()范围内没有正确的原型(因为您没有包含正确的标头)。 这意味着编译器假定它的返回类型为int

当你应该通过test2时,你也将test传递给printf()

此外:

  • 没有必要使用malloc()来分配单个uint32_t ;
  • 你不需要调用ntohl()因为inet_ntoa()期望它以网络字节顺序输入;
  • inet_ntoa()已过期 - 应在新代码中使用inet_ntop()

尝试:

#include <arpa/inet.h>

if (*packet_ethertype == ETHERTYPE_IP) { /* IPv4 */
    struct in_addr sin_addr;
    char straddr[INET_ADDRSTRLEN];

    memcpy(&sin_addr.s_addr, packet+26, 4);

    if (inet_ntop(AF_INET, &sin_addr, straddr, sizeof straddr))
        printf("%s\n", straddr);
    else
        perror("inet_ntop");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM