我的套接字类中有这段代码:
bool GSocket::Listen(int Port)
{
d->Socket = socket(AF_INET, SOCK_STREAM, 0);
if (d->Socket >= 0)
{
sockaddr Addr;
sockaddr_in *a = (sockaddr_in*) &Addr;
ZeroObj(Addr);
a->sin_family = AF_INET;
a->sin_port = htons(Port);
a->sin_addr.OsAddr = INADDR_ANY;
if (bind(d->Socket, &Addr, sizeof(Addr)) >= 0)
{
if (listen(d->Socket, SOMAXCONN) != SOCKET_ERROR)
{
return true;
}
else
{
Error();
}
}
else
{
Error();
}
}
else
{
Error();
}
return false;
}
“Error()”方法只是调用 WSAGetLastError 并将错误及其描述传递给应用程序。无论如何,它在我的机器(xp sp2)上运行良好,但在我的朋友 xp sp3 机器上却失败了。特别是绑定调用失败并且 WSAGetLastError 返回“2”,这甚至不是有效的套接字错误代码。传入的“端口”值是 80,我正在运行一个简单的 HTTP 服务器作为服务的 UI。我不完全确定为什么要检查 >= 0,但它可能与我也使用此代码的非 Windows 平台有关。在任何情况下,根据 MSDN,绑定错误的返回码是 SOCKET_ERROR,它是 -1,因此检查应该没问题。
我错过了一些简单的事情吗?
更新:我们刚刚尝试了一个不同的端口号“8888”,一切都按预期工作。所以看起来低端口号是问题所在。在我们运行我的服务之前,该端口上没有任何主动监听,所以我认为这是 SP3 中的某种新权限问题,它会停止监听端口 < 1024 的进程,除非它们具有某些权限,类似于 linux/unix 方式的做事。无论如何,我仍然希望能够解决它。