1

私は 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

私の要件を満たす良い解決策はありますか?ありがとう!

4

1 に答える 1