尝试为数据包嗅探器编写处理程序。我在转换和 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()
的范围内没有正确的原型(prototype)(因为您没有包含正确的 header )。这意味着编译器假定它的返回类型为 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");
}
关于使用原始数据包数据和 inet_ntoa() 进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9356315/