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

📄 connector.cpp

📁 linux下的终端管理工具源码
💻 CPP
字号:
/***************************************************************************//*                                                                         *//* Copyright (c) 2005, 2006 2X Software Ltd, http://www.2X.com., NoMachine *//*                                                                         *//* NXCOMP, NX protocol compression and NX extensions to this software      *//* are copyright of Nomachine. Redistribution and use of the present       *//* software is allowed according to terms specified in the file LICENSE    *//* which comes in the source distribution.                                 *//*                                                                         *//* NX and NoMachine are trademarks of Medialogic S.p.A.                    *//*                                                                         *//* 2X is a trademark of 2X Software Ltd.                                   *//*                                                                         *//* All rights reserved.                                                    *//*                                                                         *//***************************************************************************/#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include <netinet/in.h>#include <netinet/tcp.h>#include <arpa/inet.h>#define PANIC#define WARNING#define TEST#define DEBUG#include "Logger.h"#include "Socket.h"#include "Connector.h"Connector::Connector(T_connector_type type){  logTrace("Connector::Connector");  type_ = type;  fd_   = -1;  port_ = -1;  host_ = NULL;  directory_ = NULL;  file_      = NULL;  node_ = NULL;  timeout_ = nullTimestamp();}Connector::~Connector(){  logTrace("Connector::~Connector");  end();  delete [] host_;  delete [] directory_;  delete [] file_;  delete [] node_;}int Connector::setHost(const char *host){  logTrace("Connector::setHost");  if (type_ != connector_tcp || host_ != NULL || fd_ != -1)  {    logError("Connector::setHost", ESET(EPERM));    return -1;  }  else if (host == NULL || *host == '\0')  {    logError("Connector::setAccept", ESET(EINVAL));    return -1;  }  setValue(host_, host);  return 1;}int Connector::setPort(int port){  logTrace("Connector::setPort");  if (type_ != connector_tcp)  {    logError("Connector::setPort", ESET(EPERM));    return -1;  }  else if (port_ != -1)  {    logError("Connector::setPort", ESET(EPERM));    return -1;  }  port_ = port;  return 1;}int Connector::setDirectory(const char *directory){  logTrace("Connector::setDirectory");  if (type_ != connector_unix || directory_ != NULL || fd_ != -1)  {    logError("Connector::setDirectory", ESET(EPERM));    return -1;  }  else if (directory == NULL || *directory == '\0')  {    logError("Connector::setDirectory", ESET(EINVAL));    return -1;  }  setValue(directory_, directory);  return 1;}int Connector::setFile(const char *file){  logTrace("Connector::setFile");  if (type_ != connector_unix || file_ != NULL || fd_ != -1)  {    logError("Connector::setFile", ESET(EPERM));    return -1;  }  else if (file == NULL || *file == '\0')  {    logError("Connector::setFile", ESET(EINVAL));    return -1;  }  setValue(file_, file);  return 1;}int Connector::setTimeout(const T_timestamp timeout){  logTrace("Connector::setTimeout");  if (fd_ != -1)  {    logError("Connector::setFile", ESET(EPERM));    return -1;  }  timeout_ = timeout;  return 1;}int Connector::makeNode(){  logTrace("Connector::makeNode");  resetValue(node_);  if (directory_ != NULL)  {    node_ = new char[strlen(directory_) + strlen(file_) + 2];    if (node_ == NULL)    {      logError("Connector::makeNode::new", ESET(ENOMEM));      goto ConnectorMakeNodeError;    }    sprintf(node_, "%s/%s", directory_, file_);    logTest("Connector::makeNode", "Assumed compound node name '%s'",                node_);  }  else  {    node_ = new char[strlen(file_) + 1];    if (node_ == NULL)    {      logError("Connector::makeNode::new", ESET(ENOMEM));      goto ConnectorMakeNodeError;    }    strcpy(node_, file_);    logTest("Connector::makeNode", "Assumed simple node name '%s'",                node_);  }  return 1;ConnectorMakeNodeError:  resetValue(node_);  return -1;}int Connector::start(){  logTrace("Connector::start");  if (fd_ != -1)  {    logError("Connector::start", ESET(EPERM));    return -1;  }  switch (type_)  {    case connector_tcp:    {      if (host_ == NULL || port_ == -1)      {        logError("Connector::start", ESET(EPERM));        return -1;      }      return startTcp();    }    case connector_unix:    {      if (file_ == NULL)      {        logError("Connector::start", ESET(EPERM));        return -1;      }      return startUnix();    }    default:    {      logError("Connector::start", ESET(EPERM));      return -1;    }  }}int Connector::startTcp(){  logTrace("Connector::startTcp");  int ip;  if ((ip = GetHostAddress(host_)) == 0)  {    logTest("Connector::startTcp", "Can't connect to "                "unknown host '%s'", host_);    logError("Listener::startTcp", EGET());    return -1;  }  sockaddr_in address;  address.sin_family = AF_INET;  address.sin_port = htons(port_);  address.sin_addr.s_addr = ip;  if ((fd_ = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) == -1)  {    logError("Connector::startTcp::socket", EGET());    goto ConnectorStartTcpError;  }  logTest("Connector::startTcp", "Connecting to '%s' "              "on port %d", host_, port_);  if (isTimestamp(timeout_) == 1)  {    setTimer(timeout_);  }  if (connect(fd_, (sockaddr *) &address, sizeof(address)) == -1)  {    if (EGET() == EINTR && isTimestamp(timeout_))    {      logTest("Connector::startTcp::connect", "Timeout "                  "raised connecting to '%s' on "                      "port %d", host_, port_);    }    else    {      logError("Connector::startTcp::connect", EGET());    }    goto ConnectorStartTcpError;  }  if (isTimestamp(timeout_) == 1)  {    resetTimer();  }  logTest("Connector::startTcp", "Connected to '%s' "              "on port %d", host_, port_);  return 1;ConnectorStartTcpError:  if (fd_ != -1)  {    close(fd_);  }  fd_ = -1;  return -1;}int Connector::startUnix(){  logTrace("Connector::startUnix");  //  // Compose a valid node name.  //  if (makeNode() != 1)  {    return -1;  }  if (strlen(node_) >= 1024)  {    logError("Connector::startUnix", ESET(ENOMEM));    goto ConnectorStartUnixError;  }  if ((fd_ = socket(AF_UNIX, SOCK_STREAM, PF_UNSPEC)) == -1)  {    logError("Connector::startUnix::socket", EGET());    goto ConnectorStartUnixError;  }  sockaddr_un address;  address.sun_family = AF_UNIX;  strcpy(address.sun_path, node_);  logTest("Connector::startUnix", "Connecting "              "to '%s'", node_);  if (isTimestamp(timeout_) == 1)  {    setTimer(timeout_);  }  if (connect(fd_, (sockaddr *) &address, sizeof(address)) == -1)  {    if (EGET() == EINTR && isTimestamp(timeout_))    {      logTest("Connector::startUnix::connect", "Timeout "                  "raised connecting to '%s'", node_);    }    else    {      logError("Connector::startUnix::connect", EGET());    }    goto ConnectorStartUnixError;  }  if (isTimestamp(timeout_) == 1)  {    resetTimer();  }  logTest("Connector::startUnix", "Connected "              "to '%s' ", node_);  return 1;ConnectorStartUnixError:  resetValue(node_);  if (fd_ != -1)  {    close(fd_);  }  fd_ = -1;  return -1;}int Connector::end(){  logTrace("Connector::end");  if (fd_ == -1)  {    return 0;  }  fd_ = -1;  return 1;}

⌨️ 快捷键说明

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