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

📄 ksock.cpp

📁 一种效率高
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  if ( domain != PF_UNIX )    fatal( "Connecting a PF_INET socket to a PF_UNIX domain socket\n");    unix_addr.sun_family = AF_UNIX;  int l = strlen( _path );  if ( l > UNIX_PATH_MAX - 1 )  {          warning( "Too long PF_UNIX domain name '%s'\n",_path);    return false;  }    strcpy( unix_addr.sun_path, _path );  sock = ::socket(PF_UNIX,SOCK_STREAM,0);  if (sock < 0)	return false;    if ( 0 > ::connect( sock, (struct sockaddr*)(&unix_addr), 					  sizeof( unix_addr ) ) )  {      ::close( sock );      sock = -1;      return false;  }  return true;}/* * Connects the socket to _host, _port. */bool KSocket::connect( const char *_host, unsigned short int _port ){  if ( domain != PF_INET )    fatal( "Connecting a PF_UNIX domain socket to a PF_INET domain socket\n");  sock = ::socket(PF_INET,SOCK_STREAM,0);  if (sock < 0)	return false;    if ( !init_sockaddr( _host, _port) )	{	  ::close( sock );	  sock = -1;	  return false;	}  fcntl(sock,F_SETFL,(fcntl(sock,F_GETFL)|O_NDELAY));  errno = 0;  if (::connect(sock, (struct sockaddr*)(&server_name), sizeof(server_name))){      if(errno != EINPROGRESS && errno != EWOULDBLOCK){          ::close( sock );          sock = -1;          return false;      }  }else      return true;  fd_set rd, wr;  struct timeval timeout;  int ret = 0, n;  n = timeOut;  FD_ZERO(&rd);  FD_ZERO(&wr);  FD_SET(sock, &rd);  FD_SET(sock, &wr);//  printf("timeout=%d\n", n);  while(n--){      timeout.tv_usec = 0;      timeout.tv_sec = 1;      struct rlimit rlp;      getrlimit(RLIMIT_NOFILE, &rlp); // getdtablesize() equivalent. David Faure.      ret = select(rlp.rlim_cur, (fd_set *)&rd, (fd_set *)&wr, (fd_set *)0,                   (struct timeval *)&timeout);      // if(ret)      //    return(true);      switch (ret)      {	  case 0: break; // Timeout	  case 1: case 2: return(true); // Success	  default: // Error	      ::close(sock);	      sock = -1;	      return false;      }      qApp->processEvents();      qApp->flushX();  }  warning("Timeout connecting socket...\n");  ::close( sock );  sock = -1;  return false;}unsigned long KSocket::getAddr(){  if ( domain != PF_INET )    return 0;    struct sockaddr_in name; ksize_t len = sizeof(name);  getsockname(sock, (struct sockaddr *) &name, &len);  return ntohl(name.sin_addr.s_addr);}KSocket::~KSocket(){    if ( readNotifier )    {	delete readNotifier;    }    if ( writeNotifier )	delete writeNotifier;       ::close( sock ); }KServerSocket::KServerSocket( const char *_path ) :  notifier( 0L), sock( -1 ){  domain = PF_UNIX;    if ( !init ( _path ) )  {    // fatal("Error constructing PF_UNIX domain server socket\n");    return;  }      notifier = new QSocketNotifier( sock, QSocketNotifier::Read );  connect( notifier, SIGNAL( activated(int) ), this, SLOT( slotAccept(int) ) );}KServerSocket::KServerSocket( int _port ) :  notifier( 0L ), sock( -1 ){  domain = PF_INET;  if ( !init ( _port ) )  {    // fatal("Error constructing\n");    return;  }      notifier = new QSocketNotifier( sock, QSocketNotifier::Read );  connect( notifier, SIGNAL( activated(int) ), this, SLOT( slotAccept(int) ) );}bool KServerSocket::init( const char *_path ){  if ( domain != PF_UNIX )    return false;    int l = strlen( _path );  if ( l > UNIX_PATH_MAX - 1 )  {          warning( "Too long PF_UNIX domain name '%s'\n",_path);    return false;  }        sock = ::socket( PF_UNIX, SOCK_STREAM, 0 );  if (sock < 0)  {    warning( "Could not create socket\n");    return false;  }  unlink(_path);     struct sockaddr_un name;  name.sun_family = AF_UNIX;  strcpy( name.sun_path, _path );      if ( bind( sock, (struct sockaddr*) &name,sizeof( name ) ) < 0 )  {    warning("Could not bind to socket\n");    ::close( sock );    sock = -1;    return false;  }    if ( chmod( _path, 0600) < 0 )  {    warning("Could not setupt premissions for server socket\n");    ::close( sock );    sock = -1;    return false;  }                 if ( listen( sock, SOMAXCONN ) < 0 )  {    warning("Error listening on socket\n");    ::close( sock );    sock = -1;    return false;  }  return true;}bool KServerSocket::init( unsigned short int _port ){  if ( domain != PF_INET )    return false;    sock = ::socket( PF_INET, SOCK_STREAM, 0 );  if (sock < 0)  {    warning( "Could not create socket\n");    return false;  }  struct sockaddr_in name;      name.sin_family = AF_INET;  name.sin_port = htons( _port );  name.sin_addr.s_addr = htonl(INADDR_ANY);      if ( bind( sock, (struct sockaddr*) &name,sizeof( name ) ) < 0 )    {	  warning("Could not bind to socket\n");	  ::close( sock );	  sock = -1;	  return false;    }      if ( listen( sock, SOMAXCONN ) < 0 )    {	  warning("Error listening on socket\n");	  ::close( sock );	  sock = -1;	  return false;    }  return true;}unsigned short KServerSocket::getPort(){  if ( domain != PF_INET )    return false;  struct sockaddr_in name; ksize_t len = sizeof(name);  getsockname(sock, (struct sockaddr *) &name, &len);  return ntohs(name.sin_port);}unsigned long KServerSocket::getAddr(){  if ( domain != PF_INET )    return false;  struct sockaddr_in name; ksize_t len = sizeof(name);  getsockname(sock, (struct sockaddr *) &name, &len);  return ntohl(name.sin_addr.s_addr);}void KServerSocket::slotAccept( int ){  if ( domain == PF_INET )  {          struct sockaddr_in clientname;    int new_sock;        ksize_t size = sizeof(clientname);        if ((new_sock = accept (sock, (struct sockaddr *) &clientname, &size)) < 0)    {      warning("Error accepting\n");      return;    }    emit accepted( new KSocket( new_sock ) );  }  else if ( domain == PF_UNIX )  {          struct sockaddr_un clientname;    int new_sock;        ksize_t size = sizeof(clientname);        if ((new_sock = accept (sock, (struct sockaddr *) &clientname, &size)) < 0)    {      warning("Error accepting\n");      return;    }    emit accepted( new KSocket( new_sock ) );  }}KServerSocket::~KServerSocket(){  if ( notifier )	delete notifier;   struct sockaddr_un name; ksize_t len = sizeof(name);  getsockname(sock, (struct sockaddr *) &name, &len);  close( sock );  unlink(name.sun_path);                                                       }#include "ksock.moc"

⌨️ 快捷键说明

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