在我的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