私は TCP プロキシ サーバー プログラムを作成しています。次のようなコードの一部が含まれています。
// proxy server listen, waiting for incoming tcp requests
listen(listenfd, 1024);
while(1) {
connfd = accept(listenfd, (struct sockaddr *)&sender_addr, &sock_len);
pid=fork();
if(pid=0) // child process
{
// processing this connection
}
blabla.....
}
HTTP クライアントがプロキシとの TCP 接続を開始すると、プロセスは次のようになります。
client ------ TCP SYN ---------> proxy
client <------TCP SYN/ACK ------ proxy
client -------TCP ACK ---------> proxy
client ------HTTP request -----> proxy
プロキシとウェブサーバーの間でやりたいことはこの質問とは関係ありませんとにかく、クライアントは TCP SYN パケット、TCP ACK パケット、HTTP リクエスト パケットを順番に送信します。
プロキシは、多数のクライアントからの大量の受信 TCP 3 ウェイ ハンドシェイクおよび HTTP 要求を受け入れる場合があります。IPヘッダーとTCPヘッダーを含む、各着信TCP接続のTCP ACKパケットとHTTPリクエストパケット(TCPパケットでもあります)を取得したい。取得できない場合は、少なくとも HTTP リクエスト パケット ( IP ヘッダーと TCP ヘッダーを含む) を取得したいと考えています。TCP ACK
1 つの方法は、libpcap を使用して、受信 TCP 接続ごとに ACK フラグが設定されたパケットをキャプチャすることです (filter_exp は tcp[tcpflags] & (tcp-ack) != 0 のようなものです)。
このように、accept() の前に次のコード ブロックを配置すると、すべての着信 TCP 接続が同じ pcap ハンドラを共有する可能性がありますが、fork() の後に次のコード ブロックを各子プロセスに配置すると、ハンドラが一部の TCP を見逃す可能性があります。パケット
handle = pcap_open_live(dev, BUFSIZ, 0, 0, errbuf);
pcap_compile(handle, &fp, filter_exp, 0, mask) == -1
pcap_setfilter(handle, &fp);
struct pcap_pkthdr pcap_header; // The header that pcap gives us
const u_char *pcap_packet; // The actual packet
私の要件を満たす良い解決策はありますか?ありがとう!