将代码改成I/O多路复用时出现了一个bug
Bad file descriptor
这里是向已关闭的文件描述符写东西。
出问题的地方是
// 登录客户端的登录报文。
if (ClientLogin(TcpServer) == false) ChldEXIT(0);
// 出了ClientLogin这个函数后,TcpServer失效。
// 接收文件主函数
if (starg.clienttype == 1) RecvFilesMain((void*)TcpServer);
原因是当时在ClientLogin函数里写了个局部变量
CTcpServer TcpServer = *server;
随着右括号执行,局部变量被清理,fd就被关闭了。
判断fd是否有效:
int flags = fcntl(server->m_connfd, F_GETFL);
if (flags == -1) perror("1--wsm thmain TcpServer:");