📄 ksock.cpp
字号:
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 + -