我的套接字类中有这个代码:
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,bind的错误返回码是SOCKET_ERROR,它是-1,所以检查应该没问题。
我错过了一些简单的事情吗?
更新:我们刚试了一个不同的端口号'8888',一切都按预期工作。所以似乎低端口号是问题所在。在我们运行我的服务之前,没有任何主动侦听该端口,所以我认为这是SP3中某种新的权限问题,它会阻止进程侦听端口< 1024除非他们有一定的权限,类似于linux / unix的服务方式。无论如何,我仍然希望能够解决这个问题。
答案 0 :(得分:2)
0到1023范围内的端口号是well known ports,操作系统可能需要管理权限才能绑定到它们。因此,任何尝试使用这些端口的应用程序都必须具有特权。
答案 1 :(得分:0)
你正在那里进行有趣的指针运算......只需将sockaddr_in放在堆栈上,并传递一个指向它的指针即可。
sockaddr_in a = {0};
a.sin_family = AF_INET;
a.sin_port = htons(Port);
a.sin_addr.OsAddr = INADDR_ANY;
if (bind(d->Socket, (sockaddr *) &a, sizeof(a)) >= 0)
此外,尝试检查特权是否妨碍了。该端口上是否已经打开了一些东西(问netstat)