bug fixed on http server

This commit is contained in:
root 2018-01-31 11:20:50 +08:00
parent 8ef84473fc
commit 1262c4c51d

View File

@ -343,7 +343,10 @@ inline HttpSession::HttpCode HttpSession::Handle_Req_GET() {
fclose(pFp); fclose(pFp);
}); });
static uint32_t sendBufSize = mINI::Instance()[Config::Http::kSendBufSize].as<uint32_t>(); static uint32_t sendBufSize = mINI::Instance()[Config::Http::kSendBufSize].as<uint32_t>();
//不允许主动丢包
sock->setShouldDropPacket(false); sock->setShouldDropPacket(false);
//缓存大小为两个包,太大可能导致发送时间太长从而超时
sock->setSendPktSize(2);
weak_ptr<HttpSession> weakSelf = dynamic_pointer_cast<HttpSession>(shared_from_this()); weak_ptr<HttpSession> weakSelf = dynamic_pointer_cast<HttpSession>(shared_from_this());
auto onFlush = [pFilePtr,bClose,weakSelf,piLeft]() { auto onFlush = [pFilePtr,bClose,weakSelf,piLeft]() {
TimeTicker(); TimeTicker();
@ -357,14 +360,20 @@ inline HttpSession::HttpCode HttpSession::Handle_Req_GET() {
//本次需要读取文件字节数 //本次需要读取文件字节数
int64_t iReq = MIN(sendBufSize,*piLeft); int64_t iReq = MIN(sendBufSize,*piLeft);
//读文件 //读文件
int64_t iRead = fread(sendBuf->data(), 1, iReq, pFilePtr.get()); int iRead;
do{
iRead = fread(sendBuf->data(), 1, iReq, pFilePtr.get());
}while(-1 == iRead && UV_EINTR == get_uv_error(false));
//文件剩余字节数 //文件剩余字节数
*piLeft -= iRead; *piLeft -= iRead;
if (iRead < iReq || !*piLeft) { if (iRead < iReq || !*piLeft) {
//文件读完 //文件读完
//InfoL << "send complete!" << iRead << " " << iReq << " " << *piLeft;
if(iRead>0) { if(iRead>0) {
sendBuf->setSize(iRead); sendBuf->setSize(iRead);
strongSelf->sock->setSendPktSize(3);//强制写入socket缓存
strongSelf->sock->send(sendBuf,SOCKET_DEFAULE_FLAGS | FLAG_MORE); strongSelf->sock->send(sendBuf,SOCKET_DEFAULE_FLAGS | FLAG_MORE);
} }
if(bClose) { if(bClose) {
@ -377,13 +386,19 @@ inline HttpSession::HttpCode HttpSession::Handle_Req_GET() {
int iSent = strongSelf->sock->send(sendBuf,SOCKET_DEFAULE_FLAGS | FLAG_MORE); int iSent = strongSelf->sock->send(sendBuf,SOCKET_DEFAULE_FLAGS | FLAG_MORE);
if(iSent == -1) { if(iSent == -1) {
//send error //send error
//InfoL << "send error";
return false; return false;
} }
if(iSent < iRead) { if(iSent < iRead) {
//send wait //send wait
//InfoL << "send wait";
//数据回滚
fseek(pFilePtr.get(), -iRead, SEEK_CUR);
*piLeft += iRead;
return true; return true;
} }
//send success //send success
//InfoL << "send success";
} }
return false; return false;
}; };