2016-04-06 11 views
0

私はパケットを処理するユーザ空間プログラムを持っています。私はiptablesの助けを借りて彼らをそこに送ります。キャプチャされたIPパケットの同じ送信元および宛先アドレス

しかし、パケットの送信元と送信先を正しく取得するのに問題があります。宛先は192.168.1.66で、ソースは192.168.0.102である必要があります。私が書く場合でも、奇妙なことがある:

char *dstIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_dst);  
char *srcIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_src); 

私は宛先と送信元192.168.1.66の両方を取得します。
しかし、私が書く場合:

char *srcIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_src); 
char *dstIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_dst);  

私は宛先と送信元両方192.168.0.102を取得します。

問題はどこですか?

+1

これは、 'inet_ntoa'が同じ' char'配列への両方のポインタを返すからです。結果を 'std :: string'に保存します。 –

+0

そんなダンプミスで時間が浪費してしまった。あなたのコメントを答えとして書いてください、私はそれを正解とマークします.. – user2123079

+1

[RTM](https://msdn.microsoft.com/en-us/library/windows/desktop/ms738564%28v=vs.85) %29.aspx)。 "返される文字列は、次のWindowsソケット関数呼び出しが同じスレッド内で行われるまで有効であることが保証されているため、別のWindowsソケット呼び出しが行われる前にデータをコピーする必要があります。 –

答えて

0

Captain Obvliousがコメントしたように、inet_ntoaは静的に割り当てられたバッファを返します。 inet_ntoa(3)から:

INET_NTOA()関数は、IPv4ドット付き10進表記の文字列に、ネットワークバイト順で与えられ、にインターネットホストアドレスを変換します。文字列は静的に割り当てられたバッファーに戻され、それ以降の呼び出しは上書きされます。

戻り値をコピーするか、ユーザー割り当てバッファを使用するinet_ntopを使用してください。

関連する問題