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

📄 socket.cpp

📁 linux下的终端管理工具源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    #else    if (EGET() == EOPNOTSUPP)    {      result = 0;    }    #endif  }  if (result < 0)  {    #ifdef PANIC    *logofs << "Socket: PANIC! Failed to set TCP_NODELAY flag on "            << "FD#" << fd << " to " << value << ". Error is "            << EGET() << " '" << ESTR() << "'.\n" << logofs_flush;    #endif    cerr << "Error" << ": Failed to set TCP_NODELAY flag on "         << "FD#" << fd << " to " << value << ". Error is "         << EGET() << " '" << ESTR() << "'.\n";  }  #ifdef TEST  else if (result == 0)  {    #ifdef TEST    *logofs << "Socket: Option TCP_NODELAY not supported "            << "on FD#" << fd << ".\n" << logofs_flush;    #endif  }  else  {    *logofs << "Socket: Set TCP_NODELAY flag on FD#"            << fd << " to " << value << ".\n"            << logofs_flush;  }  #endif  return result;}int SetKeepAlive(int fd){  int flag = 1;  if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &flag, sizeof(flag)) < 0)  {    #ifdef PANIC    *logofs << "Socket: PANIC! Failed to set SO_KEEPALIVE flag on "            << "FD#" << fd << ". Error is " << EGET() << " '"            << ESTR() << "'.\n" << logofs_flush;    #endif    cerr << "Error" << ": Failed to set SO_KEEPALIVE flag on "         << "FD#" << fd << ". Error is " << EGET() << " '"         << ESTR() << "'.\n";    return -1;  }  #ifdef TEST  else  {    *logofs << "Socket: Set SO_KEEPALIVE flag on FD#"            << fd << ".\n" << logofs_flush;  }  #endif  return 1;}int SetLowDelay(int fd){  if (_kernelStep < 0)  {    GetKernelStep();  }  switch (_kernelStep)  {    case 3:    case 2:    case 1:    {      int flag = IPTOS_LOWDELAY;      if (setsockopt(fd, SOL_IP, IP_TOS, &flag, sizeof(flag)) < 0)      {        if (EGET() == EOPNOTSUPP)        {          #ifdef TEST          *logofs << "Socket: Option IPTOS_LOWDELAY not supported "                  << "on FD#" << fd << ".\n" << logofs_flush;          #endif        }        else        {          #ifdef PANIC          *logofs << "Socket: PANIC! Failed to set IPTOS_LOWDELAY flag on "                  << "FD#" << fd << ". Error is " << EGET() << " '" << ESTR()                  << "'.\n" << logofs_flush;          #endif          cerr << "Error" << ": Failed to set IPTOS_LOWDELAY flag on "               << "FD#" << fd << ". Error is " << EGET() << " '" << ESTR()               << "'.\n";        }        return -1;      }      #ifdef TEST      else      {        *logofs << "Socket: Set IPTOS_LOWDELAY flag on FD#"                << fd << ".\n" << logofs_flush;      }      #endif      return 1;    }    default:    {      #ifdef TEST      *logofs << "Socket: Option IPTOS_LOWDELAY not "              << "supported on FD#" << fd << ".\n"              << logofs_flush;      #endif      return 0;    }  }}int SetCloseOnExec(int fd){  if (fcntl(fd, F_SETFD, 1) != 0)  {    #ifdef TEST    *logofs << "NXClient: PANIC! Cannot set close-on-exec "            << "on FD#" << fd << ". Error is " << EGET()            << " '" << ESTR() << "'.\n" << logofs_flush;    #endif    cerr << "Error" << ": Cannot set close-on-exec on FD#"         << fd << ". Error is " << EGET() << " '" << ESTR()         << "'.\n";    return -1;  }  return 1;}int GetBytesReadable(int fd){  long readable = 0;  //  // A failure is sometimes what we want,  // for example at session shutdown.  //  if (ioctl(fd, FIONREAD, (void *) &readable) < 0)  {    #ifdef TEST    *logofs << "Socket: PANIC! Failed to get bytes readable "            << "from FD#" << fd << ". Error is " << EGET()            << " '" << ESTR() << "'.\n" << logofs_flush;    #endif    return -1;  }  #ifdef TEST  *logofs << "Socket: Returning " << readable          << " bytes readable on FD#" << fd          << ".\n" << logofs_flush;  #endif  return (int) readable;}int GetBytesWritable(int fd){  if (_kernelStep < 0)  {    GetKernelStep();  }  long writable;  switch (_kernelStep)  {    case 3:    {      //      // TODO: Should query the real size      // of the TCP write buffer.      //      writable = 16384 - GetBytesQueued(fd);      if (writable < 0)      {        writable = 0;      }      break;    }    case 2:    {      if (ioctl(fd, TIOCOUTQ, (void *) &writable) < 0)      {        #ifdef PANIC        *logofs << "Socket: PANIC! Failed to get bytes writable "                << "on FD#" << fd << ". Error is " << EGET()                << " '" << ESTR() << "'.\n" << logofs_flush;        #endif        cerr << "Error" << ": Failed to get bytes writable "             << "on FD#" << fd << ". Error is " << EGET()             << " '" << ESTR() << "'.\n";        return -1;      }      break;    }    default:    {      #ifdef TEST      *logofs << "Socket: Option TIOCOUTQ not supported "              << "on FD#" << fd << ",\n" << logofs_flush;      #endif      //      // TODO: Should query the real size      // of the TCP write buffer.      //      writable = 16384;      break;    }  }  #ifdef TEST  *logofs << "Socket: Returning " << writable          << " bytes writable on FD#" << fd          << ".\n" << logofs_flush;  #endif  return (int) writable;}int GetBytesQueued(int fd){  //  // The TIOCOUTQ ioctl is not implemented on Cygwin  // and returns the space available on Linux Kernels  // 2.0 and 2.2 (like current MIPS for PS/2). This  // function is used to detect proxy congestion, so  // it is only critical at X client side.  //  if (_kernelStep < 0)  {    GetKernelStep();  }  long queued;  switch (_kernelStep)  {    case 3:    {      if (ioctl(fd, TIOCOUTQ, (void *) &queued) < 0)      {        #ifdef PANIC        *logofs << "Socket: PANIC! Failed to get bytes queued "                << "on FD#" << fd << ". Error is " << EGET()                << " '" << ESTR() << "'.\n" << logofs_flush;        #endif        cerr << "Error" << ": Failed to get bytes queued "             << "on FD#" << fd << ". Error is " << EGET()             << " '" << ESTR() << "'.\n";        return -1;      }      break;    }    case 2:    {      //      // TODO: Should query the real size      // of the TCP write buffer.      //      queued = 16384 - GetBytesWritable(fd);      if (queued < 0)      {        queued = 0;      }      break;    }    default:    {      #ifdef TEST      *logofs << "Socket: Option TIOCOUTQ not supported "              << "on FD#" << fd << ",\n" << logofs_flush;      #endif      queued = 0;      break;    }  }  #ifdef TEST  *logofs << "Socket: Returning " << queued          << " bytes queued on FD#" << fd          << ".\n" << logofs_flush;  #endif  return (int) queued;}int GetHostAddress(const char *name){  hostent *host = gethostbyname(name);  if (host == NULL)  {    //    // On some Unices gethostbyname() doesn't    // accept IP addresses, so try inet_addr.    //    in_addr_t address = inet_addr(name);    if (address == INADDR_NONE)    {      #ifdef PANIC      *logofs << "Socket: PANIC! Failed to resolve address of '"              << name << "'.\n" << logofs_flush;      #endif      cerr << "Error" << ": Failed to resolve address of '"           << name << "'.\n";      return 0;    }    return (int) address;  }  else  {    return (*((int *) host -> h_addr_list[0]));  }}

⌨️ 快捷键说明

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