簡體   English   中英

當我只想接收一個連接時,應如何在C語言中實現非阻塞服務器行為?

[英]How should I make a non-blocking server behavior in C when I only want to receive a single connection?

在C語言中,假設我有一個服務器應用程序。 套接字已正確設置,並已綁定到本地端口,並且調用listen()函數時沒有錯誤。

像這樣的代碼:

    //obtain a connection.
    int connection;
    struct sockaddr_storage sender;
    socklen_t addr_size = sizeof(sender);
    if((connection=accept(sockfd, (struct sockaddr*)&sender, &addr_size))==-1)
            {close(sockfd); return -1; }
    if(close(sockfd)==-1){
            close(connection);
            return -1;
    }
    else
            return connection;

成功獲取一個連接文件描述符,通過該描述符可以從客戶端讀取數據。

我的應用程序要求服務器等待有限的時間,然后如果沒有建立連接,則關閉服務器並執行其他操作。 此外,最多將接受一個連接。 Accept()是一個阻塞的系統調用,但是我想避免阻塞。

解決這一問題的方法似乎有很多:

  • 一個SE問題建議使用select來解決此問題,但是select是設計用於一次監視多個文件句柄的,在這里似乎有些過分。

  • 另一個問題建議將套接字修改為非阻塞狀態,然后在循環中檢查是否建立了連接。 這也可以工作,但是看起來不是很好,因為我確實想阻止-只是不會永遠。

  • 在其他語言中,我似乎有人使用SIGALARM和alarm()命令來防止阻塞,但是我的應用程序有多個線程,這似乎是易於出錯的解決方案。

  • 在其他一些語言(Java?)中,我認為可以通過超時參數來接受接收,從而完成了此任務。 這在這里是理想的,但是我似乎找不到C中套接字的類似功能。

有沒有更好的方法來解決這個問題? 似乎別人已經想通了。 如果沒有更好的方法,上述哪種解決方案最合適? 我傾向於使套接字無阻塞,但似乎會引入大量額外的麻煩。

使用select時,請始終使用fcntl()使文件描述符始終處於非阻塞狀態,否則客戶端可能會啟動連接,select將會返回,客戶端可能會終止,並且您的服務器將永遠在accept()中被阻塞。

成功接受之后,如果程序以這種方式工作,則可以將文件描述符再次變為阻止模式。

暫無
暫無

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

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