我使用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;
}
你们认为它处理了所有的异常可能同时接受发生的呢?你也可以给我提供处理套接字异常的教程或例子吗?示例代码在网上不包括细节..提前
感谢您的回复。你知道任何好的示例代码或教程吗?我在网上查看,他们只涉及基本的东西。提前致谢。 – codereviewanskquestions
不是副手......我总是自己动手。这是一个非常简单的嵌套if/then结构来处理所有情况,但是_how_要处理每个情况取决于特定的应用程序。 (特别是错误,你是否返回一个代码或抛出一个异常?那么,这取决于你自己的约定。) – Nemo
感谢您的回答:) – user800799