学校プロジェクトとして、私はIRCサーバーをコード化する必要がありますが、問題が残っています。 私がやろうとしているのは、ブロッキングせずにクライアントのコマンドを受信して実行することです(私はサービスするクライアントが多いため)。Cソケット: n分離されたコマンドを読むための非ブロッキング方法
編集:非ブロッキングソケットとフォーク()の使用は、このプロジェクトのコマンドについて
のために禁止されている:彼らはある
- "\ rはn個\" 彼らは512です
- を分離しましたchar max
私の最初の試みは、getlineでループすることでした。 (彼らは、次のクライアントに渡すのではなく、読むことをより多くのを注目しているときのgetlineブロックとして)それは私がこれのようなループからのgetlineを削除した場合、それはすべてのために働く1つのクライアントだけのために
bool recv_cmd(t_hdl *hdl)
{
char *raw;
size_t len;
FILE *input_stream;
ssize_t nread;
len = 0;
raw = NULL;
if ((input_stream = fdopen(dup(hdl->sender->fd), "r")) == NULL)
return (false);
while ((nread = getline(&raw, &len, input_stream)) > 0)
{
printf("%lu\n", nread);
parse_cmd(hdl, raw);
exec_cmd(hdl);
}
fclose(input_stream);
return (true);
}
を完全に働いたが、クライアントだけが、クライアントからの最初のコマンドが実行される(例えば、クライアント送信する場合は「Command1を\ rを\ ncommand2 \ rを\ n」は、唯一のCommand1が実行される)
bool recv_cmd(t_hdl *hdl)
{
char *raw;
size_t len;
FILE *input_stream;
len = 0;
raw = NULL;
if ((input_stream = fdopen(dup(hdl->sender->fd), "r")) == NULL)
return (false);
if (getline(&raw, &len, input_stream) != -1)
{
parse_cmd(hdl, raw);
exec_cmd(hdl);
//free(raw
}
fclose(input_stream);
return (true);
}
私もFCLOSEを削除しようとしました()を使用して、command1を読み込んだときにcommand2がストリームバッファに残るようにしましたが、どちらも機能しませんでした。
「は、送受信されているさまざまなコマンドと応答を安全に最適化するために循環バッファを使用します。」とも言います。
どうすればよいですか?この場合、getline上で循環バッファを使用する利点は何ですか?
*ブロッキングではないソケットを使用し、ポーリングを使用して、 '選択'? –
あなたのクライアント/サーバーI/O **は、低レベルの読み書き操作(つまり、あなたのプロジェクトの要件)で**を非ブロッキングにするか、複数の同時クライアントを処理するだけで済むか高速で非連続的な方法でサーバーからの接続? – DevNull
@Someprogrammerdude私は既に選択しているが、非ブロックソケットはこのプロジェクトには使用できません:/ –