// GetBlockingMode : 1 - nonblocking | 0 - blocking | -1 - error | -2 - timeout reseted! int GetBlockingMode(int Sock) { int iSize, iValOld, iValNew, retgso; iSize = sizeof(iValOld); retgso = getsockopt(Sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&iValOld, &iSize); // Save current timeout value if (retgso == SOCKET_ERROR) return (-1); iValNew = 1; retgso = setsockopt(Sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&iValNew, iSize); // Set new timeout to 1 ms if (retgso == SOCKET_ERROR) return (-1); // Ok! Try read 0 bytes. char buf[1]; // 1 - why not :) int retrcv = recv(Sock, buf, 0, MSG_OOB); // try read MSG_OOB int werr = WSAGetLastError(); retgso = setsockopt(Sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&iValOld, iSize); // Set timeout to initial value if (retgso == SOCKET_ERROR) return (-2); if (werr == WSAENOTCONN) return (-1); if (werr == WSAEWOULDBLOCK) return 1; return 0; }
Source: https://habr.com/ru/post/335762/
All Articles