ich diesen Code in meinem Socket-Klasse haben:binden kann nicht zu niedrig Portnummer (80) auf XP sp3
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;
}
Der „Fehler()“ Methode nur ruft WSAGetLastError und übergibt den Fehler und Es ist eine Beschreibung bis zur App. Wie auch immer, es funktioniert gut auf meinem Rechner (xp sp2), aber scheitert auf meiner Freunde xp sp3 Maschine. Insbesondere schlägt der Bindungsaufruf fehl und WSAGetLastError gibt "2" zurück, was nicht einmal ein gültiger Socket-Fehlercode ist. Der Wert von "Port" ist 80, ich benutze einen einfachen HTTP-Server als UI für einen Dienst. Ich bin mir nicht ganz sicher, warum ich nach> = 0 suche, aber es könnte mit Nicht-Windows-Plattformen zusammenhängen, auf denen ich auch diesen Code verwende. In jedem Fall laut MSDN der Return-Code bei Fehler für die Bindung ist SOCKET_ERROR, die -1 ist, so dass die Prüfung in Ordnung sein sollte.
Habe ich etwas Einfaches verpasst?
Update: Wir haben gerade eine andere Portnummer '8888' versucht und alles funktioniert wie erwartet. Es scheint also, dass die niedrige Portnummer das Problem ist. Es gibt nichts, das aktiv auf diesem Port hört, bevor wir meinen Dienst ausführen, also denke ich, dass es ein neues Berechtigungsproblem in SP3 ist, das Prozesse abstößt, die auf Ports < 1024 abhören, es sei denn sie haben bestimmte Berechtigungen, die dem Linux/Unix-Weg ähneln Dinge tun. Trotzdem würde ich gerne in der Lage sein, es trotzdem zu lösen.
Können Sie tatsächlich echte Sockets mit WinSock Sockets auf diese Weise mischen? Ich hätte gedacht, Ihre Methode sollte entweder errno oder WSA Anrufe für Socket/bind/listen/... – paxdiablo
Ich bin mir ziemlich sicher, dass Sie die Anrufe mischen können, ich habe noch nie etwas Gegenteiliges gesehen. Und mein Code funktioniert schon lange so. YMMV – fret
Können Sie bitte den letzten Absatz der Frage (Ihr Update) auf eine Antwort verschieben und akzeptieren? Dies wird immer noch in der "Unanswered" -Liste angezeigt. Vielen Dank. –