【发布时间】:2010-07-22 02:28:37
【问题描述】:
我的套接字类中有这段代码:
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 中的某种新权限问题,它会停止监听端口
【问题讨论】:
-
你真的可以这样混合真正的套接字和 WinSock 套接字吗?我原以为您的方法应该使用 errno 或 WSA 调用 socket/bind/listen/...
-
我很确定你可以混合通话,我从未见过相反的情况。我的代码已经这样工作了很长时间了。 YMMV
-
您能否将问题的最后一段(您的更新)移至答案并接受它?这仍然显示在“未答复”列表中。谢谢。
-
Bill:这是一种解决方法,而不是解决方案。悬而未决的问题仍然存在,尽管我不再关心它,因为我们正在使用解决方法。我宁愿删除整个问题并重新询问是否需要跟踪。
标签: winapi sockets winsock bind