void SocketTrySend(HSocket hs, const char* ptr, int nbytes, int milliseconds, transresult_t& rt) { rt.nbytes = 0; rt.nresult = 0; if(!ptr|| nbytes<1) { return; } int n; CMyTimeSpan start; while(1) { n = send(hs, ptr+rt.nbytes, nbytes, NONBLOCKREADWRITE|SENDNOSIGNAL); if(n>0) { rt.nbytes += n; nbytes -= n; if(rt.nbytes >= nbytes) { rt.nresult = 0; break; } } else if( n==0) { rt.nresult= -2; break; } else { n = GetLastSocketError(); if(ETRYAGAIN(n)) { // CLightThread::DiscardTimeSlice(); int dwSleep=20; std::this_thread::sleep_for(std::chrono::milliseconds(dwSleep*1000)); } else { rt.nresult = -1; break; } } if(start.GetSpaninMilliseconds() > (unsigned int)milliseconds) { rt.nresult= 1; break; } } }
// if timeout occurs, nbytes=-1, nresult=1 // if socket error, nbyte=-1, nresult=-1 // if the other side has disconnected in either block mode or nonblock mode, nbytes=0, nresult=-1 void SocketTryRecv(HSocket hs, char* ptr, int nbytes, int milliseconds, transresult_t& rt) { rt.nbytes = 0; rt.nresult = 0; if(!ptr|| nbytes<1) { return; } if(milliseconds>2) { CMyTimeSpan start; while(1) { rt.nbytes = recv(hs, ptr, nbytes, NONBLOCKREADWRITE); if(rt.nbytes>0) { break; } else if(rt.nbytes==0) { rt.nresult = -1; break; } else { rt.nresult = GetLastSocketError(); if( ETRYAGAIN(rt.nresult)) { if(start.GetSpaninMilliseconds() > (unsigned int)milliseconds) { rt.nresult= 1; break; } //CLightThread::DiscardTimeSlice(); int dwSleep=20; std::this_thread::sleep_for(std::chrono::milliseconds(dwSleep*1000)); } else { rt.nresult = -1; break; } } } } else { SocketRecv(hs, ptr, nbytes, rt); } }
// if timeout occurs, nbytes=-1, nresult=1 // if socket error, nbyte=-1, nresult=-1 // if the other side has disconnected in either block mode or nonblock mode, nbytes=0, nresult=-1 void SocketTryRecv(HSocket hs, char *ptr, int nbytes, int milliseconds, transresult_t &rt) { rt.nbytes = 0; rt.nresult = 0; if(!ptr|| nbytes<1) return; if(milliseconds>2) { CMyTimeSpan start; while(1) { rt.nbytes = recv(hs, ptr, nbytes, NONBLOCKREADWRITE); if(rt.nbytes>0) { break; } else if(rt.nbytes==0) { rt.nresult = -1; break; } else { rt.nresult = GetLastSocketError(); if( ETRYAGAIN(rt.nresult)) { if(start.GetSpaninMilliseconds()>milliseconds) { rt.nresult= 1; break;} CLightThread::DiscardTimeSlice(); } else { rt.nresult = -1; break; } } } } else { SocketRecv(hs, ptr, nbytes, rt); } }
// nbytes= the count of bytes sent // if timeout occurs, nresult=1 // if socket error, nresult=-1, // if the other side has disconnected in either block mode or nonblock mode, nresult=-2 void SocketTrySend(HSocket hs, const char *ptr, int nbytes, int milliseconds, transresult_t &rt) { rt.nbytes = 0; rt.nresult = 0; if(!ptr|| nbytes<1) return; int n; CMyTimeSpan start; while(1) { n = send(hs, ptr+rt.nbytes, nbytes, NONBLOCKREADWRITE|SENDNOSIGNAL); if(n>0) { rt.nbytes += n; nbytes -= n; if(rt.nbytes >= nbytes) { rt.nresult = 0; break; } } else if( n==0) { rt.nresult= -2; break; } else { n = GetLastSocketError(); if(ETRYAGAIN(n)) { CLightThread::DiscardTimeSlice(); } else { rt.nresult = -1; break; } } if(start.GetSpaninMilliseconds()>milliseconds) { rt.nresult= 1; break;} } }
// if timeout occurs, nbytes=-1, nresult=1 // if socket error, nbyte=-1, nresult=-1 // if the other side has disconnected in either block mode or nonblock mode, nbytes=0, nresult=-1 void SocketRecv(HSocket hs, char *ptr, int nbytes, transresult_t &rt) { rt.nbytes = 0; rt.nresult = 0; if(!ptr|| nbytes<1) return; rt.nbytes = recv(hs, ptr, nbytes, BLOCKREADWRITE); if(rt.nbytes>0) { return; } else if(rt.nbytes==0) { rt.nresult=-1; } else { rt.nresult = GetLastSocketError(); rt.nresult = ETRYAGAIN(rt.nresult)? 1:-1; } }
// // if timeout occurs, nbytes=-1, nresult=1 // if socket error, nbyte=-1, nresult=-1 // if the other side has disconnected in either block mode or nonblock mode, nbytes=0, nresult=-1 // otherwise nbytes= the count of bytes sent , nresult=0 void SocketSend(HSocket hs, const char *ptr, int nbytes, transresult_t &rt) { rt.nbytes = 0; rt.nresult = 0; if(!ptr|| nbytes<1) return; //Linux: flag can be MSG_DONTWAIT, MSG_WAITALL, 使用MSG_WAITALL的时候, socket 必须是处于阻塞模式下,否则WAITALL不能起作用 rt.nbytes = send(hs, ptr, nbytes, BLOCKREADWRITE|SENDNOSIGNAL); if(rt.nbytes>0) { rt.nresult = (rt.nbytes == nbytes)?0:1; } else if(rt.nbytes==0) { rt.nresult=-1; } else { rt.nresult = GetLastSocketError(); rt.nresult = ETRYAGAIN(rt.nresult)? 1:-1; } }