123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #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; // 成功
- }
|