0

私はC++のマルチクライアントチャットプログラムを書いていますが、解決できない問題がいくつかあります。

1.ユーザーが入ると、サーバーがAccept()クライアントになり、クライアントにソケットIDを割り当てます。クライアントが切断すると、別のクライアントが入り、サーバーの後にAccept()、クライアントは別のソケットIDを取得します。ソケットIDを再利用したいのですが、 Accept()以前のクライアントの以前のソケットIDよりも大きなソケットIDが与えられます。では、どうすれば各クライアントにソケットIDを割り当てることができますか?

2.およびを使用select(fdmax + 1, &read_fds, NULL, NULL, NULL)for(i = 0; i <= fdmax; i++)て、存在するすべての接続をスキャンします。クライアントは、サーバーへのtenlet接続を使用できます。チャットに加えて、クライアントは私のサーバーでコマンド(ls、などcat)を実行できます。私のサーバーは結果を使用fork()dup()てクライアントに送信します。PATHここに問題があります。ユーザーが新しい環境変数を割り当てるとPATH、他のクライアントのも変更されます。どうすればこれを回避できますか?すべてのクライアントが独自のデフォルトPATH値を持つ必要がありますか?

4

1 に答える 1

0

最初の問題の場合:おそらく(クライアントが切断されたとしても)ソケットを閉じていません(close(2))。POSIX仕様では見つかりませんが、通常accept(2)(およびファイル記述子を作成するほとんどすべてのもの)は、可能な限り最小の記述子を返します。

そうは言っても、アプリケーションをこれに結び付ける理由はおそらくありません。アプリケーションはaccept、何かを返すことができるかのように扱う必要があります。

2番目の問題については、PATH フォークした後、直前に変更する必要がありますexec


これはさておき、質問にC++のタグを付けていることに気付きました。強力なasioを確認する必要があります。

于 2012-11-10T06:04:41.643 に答える