參考使用了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