#include "scketfuncs.h" // Linux环境下的错误代码映射 string FormatLinkError(int ErrorCode) { switch (ErrorCode) { case EACCES: return "Permission denied"; // 权限不足 case EADDRINUSE: return "Address already in use"; // 地址已被使用 case ECONNREFUSED: return "Connection refused"; // 连接被拒绝 case ETIMEDOUT: return "Connection timed out"; // 连接超时 case ENETUNREACH: return "Network unreachable"; // 网络不可达 case ECONNRESET: return "Connection reset by peer"; // 连接被对方重置 case ENOTCONN: return "Socket not connected"; // 套接字未连接 case EWOULDBLOCK: return "Operation would block"; // 操作将阻塞 case EINPROGRESS: return "Operation in progress"; // 操作进行中 case EALREADY: return "Operation already in progress"; // 操作已在进行 case EISCONN: return "Socket is already connected"; // 套接字已连接 case ENOBUFS: return "No buffer space available"; // 无缓冲区空间 case EOPNOTSUPP: return "Operation not supported"; // 操作不支持 case EPROTONOSUPPORT: return "Protocol not supported"; // 协议不支持 case ENOTSOCK: return "Not a socket"; // 不是套接字 case EAFNOSUPPORT: return "Address family not supported"; // 地址族不支持 case EINTR: return "Interrupted system call"; // 系统调用中断 case EFAULT: return "Bad address"; // 错误地址 case EMSGSIZE: return "Message too long"; // 消息过长 case EADDRNOTAVAIL: return "Address not available"; // 地址不可用 case EPERM: return "Operation not permitted"; // 操作不允许 case ENOENT: return "No such file or directory"; // 文件或目录不存在 case EIO: return "Input/output error"; // 输入/输出错误 default: return "Socket error " + to_string(ErrorCode); // 默认错误 } } // 安全关闭套接字 int CLOSESOCKET(int& s) { int ret = 0; if (s != -1) { // Linux中无效套接字为-1 // 设置为阻塞模式以避免未完成操作 int flags = fcntl(s, F_GETFL, 0); if (flags != -1) { fcntl(s, F_SETFL, flags & ~O_NONBLOCK); } // 先关闭读写通道再关闭套接字 ret = shutdown(s, SHUT_RDWR); close(s); s = -1; // 标记为无效套接字 } return ret; } // 设置TCP keep-alive参数 int socket_set_keepalive(int fd) { int alive = 1; // 启用keep-alive机制 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &alive, sizeof(alive))) { return -1; // 设置失败 } // 设置空闲时间(秒) int idle = 10; // 10秒无活动后开始探测 if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(idle))) { return -2; // 设置失败 } // 设置探测间隔(秒) int interval = 5; // 5秒探测间隔 if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &interval, sizeof(interval))) { return -3; // 设置失败 } // 设置最大探测次数 int count = 3; // 最多探测3次 if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &count, sizeof(count))) { return -4; // 设置失败 } return 0; // 成功 }