我正在用 C++ 编写一个数据包嗅探器,利用流而不是printf()
存储和创建输出。我遇到的问题是,当我有两个或多个使用流生成输出的语句时,它recvfrom()
似乎失败并返回。-1
如果我注释两个输出生成语句之一,程序运行良好。通过反复试验,我发现通过std::setw()
从std::cout
语句中删除 ,它将正常工作并显示数据包和“牛肉”消息。
任何想法或帮助将不胜感激,因为我不知所措并考虑恢复使用,printf()
因为它从未遇到过这个问题(并且比流更快)。我承认,这真的是我第一次ostringstream
使用它,我可能使用不正确。
我的简化源代码:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <linux/if_packet.h>
std::string BufferInHex( unsigned char * buffer, int length )
{
std::ostringstream out;
for( int i = 0; i < length; i ++ ) {
if( i % 16 == 0 && i != 0 ) {
out << "\n";
}
else if( i % 8 == 0 && i != 0 ) {
out << " ";
}
out << std::hex;
out << std::setfill('0') << std::setw(2) << static_cast<unsigned>(buffer[i]) << " ";
out << std::dec;
}
return out.str();
}
int main( void )
{
struct sockaddr_ll saddr = {0};
socklen_t saddr_size = sizeof(saddr);
unsigned char packet[1500] = {0};
int sockFd = socket( AF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );
if( sockFd < 0 ) {
std::cerr << "Error creating socket!\n";
return 1;
}
int data_size = recvfrom( sockFd, packet, sizeof( packet ), 0, (struct sockaddr*)&saddr, &saddr_size );
if( data_size == -1 ) {
std::cerr << "Error in recvfrom()\n";
return 2;
}
std::cout << std::hex;
std::cout << std::setw( 8 ) << ntohs( 0xADDE ) << "\n";
std::cout << std::dec;
std::cout << BufferInHex( packet, data_size ) << "\n";
return 0;
}
它正在使用以下命令在 Centos 6.4 内核 2.6.32 上使用 g++ 进行编译:
g++ sniff.cpp -o sniff -Wall
感谢您的任何想法或帮助,
耶利米