は、私は巨大なバッファサイズを持っていると私はそれは、クライアントが送信されたすべてのものを受け取ることになりますと仮定しました。 しかし、私はパケットセグメンテーションのような問題に直面しました。読み取りハンドル問題
クライアントが500バイトを送信したのに何とか2つの250バイトのパケットがある場合、この状況を処理する方法はありません。
私はオンライン見上げると、このコード
int handle_read(client *cli, struct epoll_event *ev) {
size_t len = 4096;
char *p;
ssize_t received;
cli->state = 1;
if (cli->buffer != NULL) {
//free(cli->buffer);
//printf("Buff not null %s\n", cli->buffer);
}
//allocate space for data
cli->buffer = (char*)malloc((size_t)(sizeof(char) * 4096));
p = cli->buffer;
do { //read until loop conditions
received = recv(ev->data.fd, p, len, 0);
if (received < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
//if error, remove from epoll and close socket
printf("Handle error!!!\nClient disconnected!\n");
epoll_ctl(epollfd, EPOLL_CTL_DEL, ev->data.fd, ev);
close(ev->data.fd);
}
p = &cli->buffer[received];
} while (received >= len && errno != EAGAIN && errno != EWOULDBLOCK);
return received;
}
を見つけたあなたたちはそれを受けながら、すべての例外が起こるかもしれない扱いと思いますか?また、ソケット例外を扱うチュートリアルやサンプルを教えてください。サンプルコードはオンラインでは詳細をカバーしていません。事前にお礼します。
ご返信ありがとうございます。あなたは良いサンプルコードやチュートリアルを知っていますか?私はオンラインで見て、彼らは基本的なものだけをカバーしました。前もって感謝します。 – codereviewanskquestions
私はいつも自分自身を転がします。これは非常にシンプルなネストされたif/then構造ですべてのケースを処理しますが、各ケースを処理する方法は特定のアプリケーションによって異なります。 (特に、エラー。コードを返すか、例外をスローするのですか?それはあなたの慣習によります) – Nemo
答えをありがとう。 – user800799