フォワードプロキシを書きました。WindowsとLinuxの両方に使用します。OSごとに変更が必要です。ただし、いくつかの昇給条件が見られます。ほとんどの場合、最後のパケット (FIN 信号) を推測する際の私の誤解によるものだと思います。現在、ソケットのセットを選択しています。どちらのソケットが通知されても、read() を実行します。read が 0 を返す場合、それは FIN パケットであると想定し、そのソケットを閉じます。私の read() がゼロ以外の値を与えることはありえますか。しかし、そのパケットにはFINが含まれています(発生する可能性があると思います)。そのため、いくつかのソケットは閉じられていますが、閉じません。プロキシがどのソケットが閉じられたかを検出する方法がわかりません。または、確立された接続の最後のパケットです。
私のコードは次のようになります。
クライアントから受け入れた 100 個の fds があります。それらを配列に保存しますsock_array[total_size]
。
select(copy_of_sock_array,timeout)
for(int cnt=0;cnt<total_size;cnt++)
{
if(FD_ISSET(sock_array[cnt],sock_array))
{
ret = recv(sock_array[cnt],buffer,len);
if(ret<=0){
/*This must be a FIN packet */
/* Close corresponding socket which is opened with outer world */
close(/*corresponding socket*/);
}
}
}
これは大丈夫に見えますか?
ありがとう