套接字数据类型

在 Winsock 应用程序中,套接字描述符不是文件描述符,必须与 Winsock 函数一起使用。

在 UNIX 中,套接字描述符由标准文件描述符表示。 因此,UNIX 上的套接字描述符可以传递给任何标准文件 I/O 函数, (读取和写入,例如) 。

此外,UNIX 中的所有句柄(包括套接字句柄)都是较小的非负整数,并且某些应用程序会假设这一点是正确的。

Windows 套接字句柄没有限制,但INVALID_SOCKET的值不是有效的套接字。 套接字句柄可能采用 0 到 INVALID_SOCKET–1 范围内的任何值。

由于 SOCKET 类型是无符号的,因此从 UNIX 环境(例如)编译现有源代码可能会导致编译器发出有关有符号/无符号数据类型不匹配的警告。

例如,这意味着,不应通过将返回值与 –1 进行比较来检查 套接字accept 函数返回时的错误,或者查看该值是否为负 (UNIX) 中的常见和合法方法。 相反,应用程序应使用 Winsock2.h 头文件中定义的清单常量INVALID_SOCKET。 例如:

典型 BSD UNIX 样式

s = socket(...);
if (s == -1)    /* or s < 0 */
    {/*...*/}

首选样式

s = socket(...);
if (s == INVALID_SOCKET)
    {/*...*/}

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

Winsock 编程注意事项