【发布时间】:2011-06-21 03:54:46
【问题描述】:
我正在使用 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;
}
你们认为它可以处理接收时可能发生的所有异常吗?您还可以为我提供处理套接字异常的教程或示例吗?在线示例代码不包含详细信息.. 在此先感谢
【问题讨论】:
标签: c++ sockets networking