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