⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bufio.cpp

📁 在嵌入linux-arm上运行的bt下载应用程序
💻 CPP
字号:
#include "./bufio.h"#ifndef WINDOWS#include <unistd.h>#include <sys/time.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#endif#include <string.h>#include <errno.h>#include "btrequest.h"#define DEF_BUF_SIZ 36864  /* 36 KB */#define INCREAST_SIZ 32768  /*  32 KB */#define MAX_BUF_SIZ 135168  /* 132 KB */#define _left_buffer_size (n - p)BufIo::BufIo(){  f_socket_remote_closed = 0;  b = new char[DEF_BUF_SIZ];#ifndef WINDOWS  if( !b ) throw 9;#endif  p = 0;  n = DEF_BUF_SIZ;}ssize_t BufIo::_realloc_buffer(){  char *tbuf;  if( ( n + INCREAST_SIZ ) >= MAX_BUF_SIZ ) return -1; // buffer too long  tbuf = new char[n + INCREAST_SIZ];#ifndef WINDOWS  if( !tbuf ) return -1;#endif  if(p) memcpy(tbuf, b, p);  delete []b;  b = tbuf;  n += INCREAST_SIZ;  return 0;}// retval// successful return bytes sended. otherwise -1;ssize_t BufIo::_SEND(SOCKET sk,  char *buf, size_t len){  ssize_t r;  size_t t = 0;  for(; len;){    r = SEND(sk,buf,len);    if(r < 0){#ifndef WINDOWS      if(errno == EINTR) continue;#endif      return (EWOULDBLOCK == errno || EAGAIN == errno) ? (ssize_t)t : -1;    }else if( 0 == r ){      return t;			// no possible???    }else{      buf += r;      len -= r;      t += r;    }  }  return (ssize_t)t;}ssize_t BufIo::_RECV(SOCKET sk, char *buf,size_t len){  ssize_t r;  size_t t = 0;  for(; len;){    r = RECV(sk,(char*)buf,len);    if(r < 0){#ifndef WINDOWS      if(errno == EINTR) continue;#endif      return (EWOULDBLOCK == errno || EAGAIN == errno) ? (ssize_t)t : -1;    }else if( 0 == r ){      f_socket_remote_closed = 1;      return t;		//connection closed by remote.    }else{      buf += r;      len -= r;      t += r;    }  }  return (ssize_t)t;}ssize_t BufIo::Put(SOCKET sk, char *buf,size_t len){  ssize_t r;  if( _left_buffer_size < len ){ //no enough space    r = FlushOut(sk);    if( r < 0 ) return r;    for( ; _left_buffer_size < len; ) // still no enough space      if(_realloc_buffer() < 0) return -3;  }  memcpy(b + p, buf, len);  p += len;  return 0;}ssize_t BufIo::FeedIn(SOCKET sk){  ssize_t r;  if(!_left_buffer_size)    if(_realloc_buffer() < 0) return (ssize_t) -2;    r = _RECV(sk, b + p, _left_buffer_size);  if( r < 0 ) return -1;  else{    if( r ) p += r;    if( f_socket_remote_closed ) return -2; // connection closed by remote  }  return (ssize_t) p;}ssize_t BufIo::PutFlush(SOCKET sk, char *buf,size_t len){  if( _left_buffer_size < len && p){    if( FlushOut(sk) < 0) return -1;  }  for(; _left_buffer_size < len; )    if( _realloc_buffer() < 0) return -3;  memcpy(b + p, buf, len);  p += len;  return FlushOut(sk);}// retval// >= 0 left bytes in buffer// < 0 failedssize_t BufIo::FlushOut(SOCKET sk){  ssize_t r;  if( !p ) return 0;		// no data to be send    r = _SEND(sk,b,p);  if( r < 0 ) return r;  else if( r > 0){    p -= r;    if( p ) memmove(b, b + r, p);  }  return (ssize_t)p;}ssize_t BufIo::PickUp(size_t len){  if( p < len ) return -1;  p -= len;  if( p ) memmove(b, b + len, p);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -