2012-02-03 7 views
0

これは私のコードです。コンパイル中にエラーが発生することはありません。私はそれを実行したときしかし、それは誤りから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; 

}

+0

errnoをチェックして、それがあなたにヒントを与えるかどうかを確認してください。 – John3136

+0

Errno 107はソケットが接続されていないことを意味します(それ以上)。これが起こる理由はいくつかあります。あなたが正しいとみなし、接続の両側がソケットがまだ開いていると主張すると、中間ルータ/スイッチがタイムアウトのために接続を切断した可能性があります。そのような事態を避ける最も安全な方法は、定期的に「健康」または「キープアライブ」メッセージを送信することです。 どうすればいいですか? – divinediu

+0

代わりにraw TCPソケットを使用するか、通常のSOCK_STREAMを使用する理由はありますか? TCPには、すべてのパケットが送受信され、送信された順序で受信されることを確認するための組み込みのものがたくさんあります。 RAWソケットを使用することで、ウィンドウサイズ、送信、スリーウェイハンドシェーク、接続リセットをすべて自分で追跡する必要があります。もちろん、実際のIPヘッダーとTCPヘッダーを解析して作成します。ここで問題となるのは、3方向ハンドシェイクを処理しないため、接続が正しく接続されないことがあることです。 –

答えて

0

あなただけの次を使用し、すべてのイーサネットトラフィックを盗聴したい場合:

sock_raw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 

通常rawソケットを唯一のUNIXまたはLinuxでrootユーザーのために動作します。

一部の古いWindowsでは、rawソケットがまったく使用できません。 saddr

タイプは次のようになります。

struct sockaddr_ll 
2

uはちょうど./executablefilename前にsudoコマンドを使用して実行可能ファイルを実行する時期。 のような:$ gccのpack.c -oパック 、その後 $ sudoを./pack それは私が過去にその問題に遭遇しました おかげ

-1

を細かい実行されます。 RAWソケットを作成するには、管理者権限で実行可能ファイルを実行する必要があります。

関連する問題