Я работаю над сетевым программированием с использованием epoll, и у меня есть этот код ...
int read = read(socket, buf, bufsize);
У меня огромный размер буфера, и я предполагал, что он будет получать все отправленные клиенты.Однако я начал сталкиваться с такими проблемами, как сегментация пакетов.
Один из примеров: если клиент отправил 500 байтов, но каким-то образом попал в два пакета по 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;
}
Как вы думаете, ребята, он обрабатывает все исключения, которые могут возникнуть при получении?Также не могли бы вы предоставить мне учебные пособия или примеры, которые обрабатывают исключения сокетов?Примеры кодов онлайн не охватывают детали .. Заранее спасибо