在函数失败时返回值

提供清单常量 SOCKET_ERROR 用于检查函数失败。 尽管使用此常量不是强制性的,但建议使用。 下面的示例演示了 SOCKET_ERROR 常量的使用。

典型的 BSD 样式(在 Windows 上不起作用)

        r = recv(ClientSocket, recvbuf, recvbuflen, 0);
        if (r == -1     /* or r < 0 */
            && errno == EWOULDBLOCK) {
            printf("recv failed with error: EWOULDBLOCK\n");
        }    

Windows 样式

        iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
        if (iResult == SOCKET_ERROR ) {
            iError = WSAGetLastError();
            if (iError == WSAEWOULDBLOCK)
                printf("recv failed with error: WSAEWOULDBLOCK\n");
            else
                printf("recv failed with error: %ld\n", iError);

            closesocket(ClientSocket);
            WSACleanup();
            return 1;
        }    

错误代码 - errno、h_errno 和 WSAGetLastError

处理 Winsock 错误

将套接字应用程序移植到 Winsock

Winsock 编程注意事项

Windows 套接字错误代码