簡體   English   中英

在C linux中關閉服務器套接字

[英]Closing a server socket in C linux

我有一個看起來像這樣的服務器程序

{
    socket();
    bind();
    listen();

    while(1)
    {
        accept();
        recv();
        send();
        close();
    }

    close();
}

假設服務器正在運行,正在偵聽指定端口。 如何按鍵盤將其關閉? 我的意思是適當的關閉,而不是按Ctrl + C。

close()一個阻塞accept() close()的套接字時, accept()調用將立即以-1返回。

如果您的程序像您顯示的那樣是單線程的,那么您將無法執行上述操作。 您可能需要引入至少一個其他線程才能實際執行close()

  1. 讓程序安裝一個不執行任何操作的信號處理程序(例如SIGUSR1 )。

  2. 使用setsockopt()可以為使用中的套接字取消設置選項SA_RESTART

  3. 使發出套接字相關系統調用的代碼知道它們可能會返回-1並且errno設置為EINTR

  4. 運行程序。

  5. 從外部向其發送信號,表明該程序已安裝了處理程序(在1.中)(例如,使用kill <pid> -USR1命令)。

  6. 檢測信號的接收(請參閱3.)並作出反應,例如通過close()有問題的套接字來close()

暫無
暫無

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

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