在我的TCP服务器,我想连接(活动)插座有:非阻塞PASV袜子和阻塞
非阻塞被动插座有无阻塞接受();
接受连接后,我想喜欢核实客户提供的ID和密码进行一些认证。所以我有明确的协议,我想通过连接套接字阻止TCP服务器和客户端之间的recv()/ send()对话。
客户端身份验证后,我想有无阻塞连接插座,以便从外部线程服务器关闭。
问题是,当我第一次设置非阻塞PASSIVE套接字然后接受CONNECTION套接字也是非阻塞?他们为什么不分开套接字?
fcntl(ps_fd, F_SETFL, O_NONBLOCK);
我通过连接插座做认证:
if((n_recv = recv(sock_fd, buf, sizeof(buf) - 1, 0)) <= 0) { ... }
但这里recv()
不会阻止和客户不能提供
我已经使用这个代码被动套接字设置为非阻塞模式它是EAGAIN
错误之前的身份验证标识和密码。
我可以恢复连接插座在阻断模式又和被动插座左无阻塞?
这听起来非常错误的...不要在一个客户端上阻止你的整个服务!相反,使用一些上下文和一个状态机。同时建议'选择()'(或什么特定平台的像'的epoll()'),而不是'O_NONBLOCK' –
啊,但他们似乎从被动套接字继承状态,并不会阻止:( –
所以把它们放到阻塞模式是什么阻止你? – EJP