簡體   English   中英

阻止接受

[英]Blocking accept

我正在編寫TCP / IP套接字服務器。

我的問題是,當我(例如)telnet我的服務器並且不發送任何數據時,我的接受呼叫阻塞並且不接受任何新的連接。

當我發送任何內容或退出telnet接受停止阻止時,我可以處理發送的數據並接受開始接受新的連接。

main() {
   socket = bind_listen();

   while(1) {
       user_socket = accept(socket);
       ssl = SSL_new(ctx);
       SSL_set_fd(ssl, user_socket);
       SSL_accept(ssl);

       event.data.fd = user_socket;
       event.events = EPOLLIN | EPOLLONESHOT;

       epoll_proof = epoll_ctl(poll_fd, EPOLL_CTL_ADD, user_socket, &event);
   }
}

epoll_wait()和處理數據有幾個線程。 任何想法? 謝謝!

那是因為你的程序是一個單一的線程。 在第一步中它等待連接,之后,當建立連接時,它等待輸入。
你有幾個選項讓它等待幾個連接並接受它們:線程,選擇和fcntl。

您可以使用多路復用器,例如select或poll族。

這將告訴您什么時候可以運行接受w / out被阻止。

如果您不知道如何使用多路復用器,我認為select是最簡單的解決方案: http//linux.die.net/man/2/select

這也可以避免阻塞讀/寫等不良情況。

首先,您應該輪詢偵聽文件描述符(使用selectpollepoll / kqueue ),並且只有在准備好讀取時才調用accept

其次,更具體地說,如果您要使用邊緣觸發的epoll ,則需要先將套接字設置為非阻塞模式。 然后,當你被告知它已准備好讀取時,你需要在循環中調用accept ,直到你返回-1並出現錯誤EAGAINEWOULDBLOCK - 可能有多個連接請求一次等待,而邊緣觸發的輪詢僅警報你在狀態變化 ,所以你需要耗盡插座。

在一個非常,非常幼稚的方式,你也可以用投票廢除, 與非阻塞套接字的工作,無論是在繁忙的循環,或與一種睡眠循環。 但這完全是浪費,並且與正確的epoll / kqueue解決方案(或您的平台提供的任何輪詢機制)相比,並沒有給您帶來任何epoll

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM