日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

listen()和accept()函数:让套接字进入监听状态并响应客户端请求

發布時間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 listen()和accept()函数:让套接字进入监听状态并响应客户端请求 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于服務器端程序,使用 bind() 綁定套接字后,還需要使用 listen() 函數讓套接字進入被動監聽狀態,再調用 accept() 函數,就可以隨時響應客戶端的請求了。

listen() 函數

通過 listen() 函數可以讓套接字進入被動監聽狀態,它的原型為:

  • int listen(int sock, int backlog); //Linux
  • int listen(SOCKET sock, int backlog); //Windows
  • sock 為需要進入監聽狀態的套接字,backlog 為請求隊列的最大長度。

    所謂被動監聽,是指當沒有客戶端請求時,套接字處于“睡眠”狀態,只有當接收到客戶端請求時,套接字才會被“喚醒”來響應請求。

    請求隊列

    當套接字正在處理客戶端請求時,如果有新的請求進來,套接字是沒法處理的,只能把它放進緩沖區,待當前請求處理完畢后,再從緩沖區中讀取出來處理。如果不斷有新的請求進來,它們就按照先后順序在緩沖區中排隊,直到緩沖區滿。這個緩沖區,就稱為請求隊列(Request Queue)。

    緩沖區的長度(能存放多少個客戶端請求)可以通過 listen() 函數的 backlog 參數指定,但究竟為多少并沒有什么標準,可以根據你的需求來定,并發量小的話可以是10或者20。

    如果將 backlog 的值設置為?SOMAXCONN,就由系統來決定請求隊列長度,這個值一般比較大,可能是幾百,或者更多。

    當請求隊列滿時,就不再接收新的請求,對于 Linux,客戶端會收到 ECONNREFUSED 錯誤,對于 Windows,客戶端會收到?WSAECONNREFUSED 錯誤。

    注意:listen() 只是讓套接字處于監聽狀態,并沒有接收請求。接收請求需要使用 accept() 函數。

    accept() 函數

    當套接字處于監聽狀態時,可以通過 accept() 函數來接收客戶端請求。它的原型為:

  • int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); //Linux
  • SOCKET accept(SOCKET sock, struct sockaddr *addr, int *addrlen); //Windows
  • 它的參數與 listen() 和 connect() 是相同的:sock 為服務器端套接字,addr 為 sockaddr_in 結構體變量,addrlen 為參數 addr 的長度,可由 sizeof() 求得。

    accept() 返回一個新的套接字來和客戶端通信,addr 保存了客戶端的IP地址和端口號,而 sock 是服務器端的套接字,大家注意區分。后面和客戶端通信時,要使用這個新生成的套接字,而不是原來服務器端的套接字。

    最后需要說明的是:listen() 只是讓套接字進入監聽狀態,并沒有真正接收客戶端請求,listen() 后面的代碼會繼續執行,直到遇到 accept()。accept() 會阻塞程序執行(后面代碼不能被執行),直到有新的請求到來。

    總結

    以上是生活随笔為你收集整理的listen()和accept()函数:让套接字进入监听状态并响应客户端请求的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。