求解答,小文件能正发送至浏览器,大一点的发送失败,浏览器显示未收到服务器发送过来的数据
int send_file(struct bufferevent* bev,const char* filename)
{
int fd=open(filename,O_RDONLY);
if(fd == -1){
string str="open "s + filename +" failed"s;
perror(str.c_str());
return -1;
}
char buf[4096]{0};
int readsize=0;
int ret=0;
int sum=0;
while(1){
bzero(buf,sizeof(buf));
readsize=Read(fd,buf,sizeof(buf));
if(readsize == 0) break;
else if(readsize == -2) continue; // 连接是正常的,调用者 继续接收
else if(readsize == -1){ // 错误读取,退出调用
close(fd);
return -1;
}
ret=bufferevent_write(bev,buf,readsize);
// cout<<"errno = "<<errno<<endl; // 一直等于11
// perror("failed : "); //Resource temporarily unavailable
}
close(fd);
return 0;
}
我在实现基于Libevent库的b/s模型时,使用bufferevent_write向浏览器发送10M的mp3文件失败,打印错误码errno的值一直等于11 resource temporarily unavailable, 并在回调函数调用完之后异常终止,无错误信息。并非跳出event_base_dispatch()循环监听!
这个问题可能是由于发送数据速度过快而导致的缓冲区溢出。
在使用 Libevent 库中的 bufferevent_write() 函数发送数据时,该函数将数据写入内部缓冲区,并尝试异步地将缓冲区中的数据发送到套接字。如果缓冲区已满,调用将阻塞或返回
EAGAIN
或EWOULDBLOCK
错误。根据你提供的代码,你使用的是阻塞式的文件读取(read()),并直接将读取到的数据使用 bufferevent_write() 发送到客户端。由于数据一次读取并发送的速度较快,可能出现以下情况之一:
EAGAIN
或EWOULDBLOCK
错误,并且将数据写入缓冲区的操作被阻塞。EAGAIN
或EWOULDBLOCK
错误。为了解决这个问题,你可以尝试以下方法:
SO_SNDBUF
选项。这可以提高发送大块数据的性能。