これは私のコードです。コンパイル中にエラーが発生することはありません。私はそれを実行したときしかし、それは誤りからrawソケットが作成されないのはなぜですか?
のRecvを与え、パケット
エラーを取得できませんでした。なにが問題ですか?
logfile=fopen("log.txt","w");
if(logfile==NULL) printf("Unable to create file.");
printf("Starting...\n");
//Create a raw socket that shall sniff
sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);
if(sock_raw < 0)
{
printf("Socket Error\n");
return 1;
}
while(1)
{
saddr_size = sizeof saddr;
//Receive a packet
data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , &saddr_size);
if(data_size <0)
{
printf("Recv from error , failed to get packets\n");
return 1;
}
//Now process the packet
ProcessPacket(buffer , data_size);
}
close(sock_raw);
printf("Finished");
return 0;
}
errnoをチェックして、それがあなたにヒントを与えるかどうかを確認してください。 – John3136
Errno 107はソケットが接続されていないことを意味します(それ以上)。これが起こる理由はいくつかあります。あなたが正しいとみなし、接続の両側がソケットがまだ開いていると主張すると、中間ルータ/スイッチがタイムアウトのために接続を切断した可能性があります。そのような事態を避ける最も安全な方法は、定期的に「健康」または「キープアライブ」メッセージを送信することです。 どうすればいいですか? – divinediu
代わりにraw TCPソケットを使用するか、通常のSOCK_STREAMを使用する理由はありますか? TCPには、すべてのパケットが送受信され、送信された順序で受信されることを確認するための組み込みのものがたくさんあります。 RAWソケットを使用することで、ウィンドウサイズ、送信、スリーウェイハンドシェーク、接続リセットをすべて自分で追跡する必要があります。もちろん、実際のIPヘッダーとTCPヘッダーを解析して作成します。ここで問題となるのは、3方向ハンドシェイクを処理しないため、接続が正しく接続されないことがあることです。 –