天天看點

socket的非阻塞模式

參考使用了socket非阻塞模式,調用成功。這個是找到的連結資料。有空再把自己總結的上傳一下。

非阻塞IO 和阻塞IO:

在網絡程式設計中對于一個網絡句柄會遇到阻塞IO 和非阻塞IO 的概念, 這裡對于這兩種socket 先做一下說明:
   基本概念:

          阻塞IO::

                 socket 的阻塞模式意味着必須要做完IO 操作(包括錯誤)才會

                 傳回。

          非阻塞IO::

                 非阻塞模式下無論操作是否完成都會立刻傳回,需要通過其他方

                 式來判斷具體操作是否成功。(對于connect,accpet操作,通過select判斷,

                  對于recv,recvfrom,send,sendto通過傳回值+錯誤碼來判斷)
           

IO模式設定:

SOCKET
   對于一個socket 是阻塞模式還是非阻塞模式的處理方法::

   方法::

           用fcntl 設定;用F_GETFL擷取flags,用F_SETFL設定flags|O_NONBLOCK;

           同時,recv,send 時使用非阻塞的方式讀取和發送消息,即flags設定為MSG_DONTWAIT

                                                     實作
           

fcntl 函數可以将一個socket 句柄設定成非阻塞模式:

flags = fcntl(sockfd, F_GETFL, 0); //擷取檔案的flags值。

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);   //設定成非阻塞模式;

  flags  = fcntl(sockfd,F_GETFL,0);

  fcntl(sockfd,F_SETFL,flags&~O_NONBLOCK);    //設定成阻塞模式;

  并在接收和發送資料時:

 将recv, send 函數的最後有一個flag 參數設定成MSG_DONTWAIT

 recv(sockfd, buff, buff_size,MSG_DONTWAIT);     //非阻塞模式的消息發送

 send(scokfd, buff, buff_size, MSG_DONTWAIT);   //非阻塞模式的消息接受
           

見連結

https://www.cnblogs.com/guozht/p/11236199.html

繼續閱讀