2016-12-18 220 views
0

我正在做一個基本的聊天程序,我有一個問題。 我想問一下,recv(socket,buf,buflen,0)在C++中是異步的嗎?我在while循環中使用它,並阻塞循環,直到服務器不向客戶端發送數據。C++ recv異步服務器客戶端

回答

0

默認情況下,一個插座使用阻止I/O。如果要使用非阻塞I/O,則必須通過在Windows上使用ioctlsocket(FIONBIO)或在其他平臺上使用fcntl(O_NONBLOCK)來明確啓用它。如果I/O操作會阻止調用者,則I/O操作將失敗,並顯示可檢測到的錯誤((WSA)EWOULDBLOCK,EAGAIN,EINPROGRESS等),以便您稍後重複該操作。

或者,您可以使用select()(e)poll()在執行否則會阻塞的讀/寫操作之前等待套接字處於可讀/寫狀態。或者,在某些平臺上,可以使用setsockopt()啓用SO_RCVTIMEO/SO_SNDTIMEO超時以阻止讀取/寫入操作。如果你想異步I/O取而代之(開始一個操作,它在後臺完成,然後在完成時通知你),你必須將I/O移到單獨的工作線程,或者在Windows上您可以使用支持重疊I/O和I/O完成端口的一些擴展套接字函數(ConnectEx(),WSARecv(),WSASend()等)。