vfl_freak
Premium-User
[C/C++]Exception bei "Socket als Listener registrieren"
Hallo zusammen,
vielleicht kann mir jemand bei einem seltsamen Fehler helfen
Ich habe hier ein Server-Programm (C + C++ gemischt :-( mit Visual C++ 6.0 unter Win XP Prof.) übernommen, in dem im sog. "GenericServer" innerhalb eines Threads permanent eine Socketverbindung zum zugehörigen Client überwacht wird. Auf dieser Verbindung werden Befehle an dern Server gesendet und die Resulte zurückgeschickt!
Nun suche ich schon seit einiger Zeit nach der Ursache für gelegentliche, unregelmäßige Abstürze. Dabei ist mir im Debugger aufgefallen, dass jedesmal direkt nach dem Programmstart als erstes folgender Eintrag kommt:
"nicht abgefangene Ausnahme:" #GSWorkerServer.exe: 0x00000002: (kein Name)"
Ich habe die Stelle im Code jetzt soweit wie folgt einschränken können:
Leider durchblicke ich den Code auch nicht an allen Stellen zu 100%, habe ihn aber soweit wie hier dargestellt, kommentieren können
..... leider ist hier bei uns sonst nix kommentiert oder dokumentiert 
Gecatcht wird die Exception scheinbar leider auch nicht, d. h. das nachfolgende TRACE sehe ich nicht in der Konsole!! Allerdings läuft das Programm auch problemlos weiter (u. U. sogar mehrere Tage)!!
Hat irgendjemand schon mal ein gleichartiges Problem gehabt oder auch nur eine Idee, wie ich hier weiter vorgehen kann Bin leider mit meinem Latein ziemlich am Ende!
Danke und Gruß
Klaus
Hallo zusammen,
vielleicht kann mir jemand bei einem seltsamen Fehler helfen

Ich habe hier ein Server-Programm (C + C++ gemischt :-( mit Visual C++ 6.0 unter Win XP Prof.) übernommen, in dem im sog. "GenericServer" innerhalb eines Threads permanent eine Socketverbindung zum zugehörigen Client überwacht wird. Auf dieser Verbindung werden Befehle an dern Server gesendet und die Resulte zurückgeschickt!
Nun suche ich schon seit einiger Zeit nach der Ursache für gelegentliche, unregelmäßige Abstürze. Dabei ist mir im Debugger aufgefallen, dass jedesmal direkt nach dem Programmstart als erstes folgender Eintrag kommt:
"nicht abgefangene Ausnahme:" #GSWorkerServer.exe: 0x00000002: (kein Name)"
Ich habe die Stelle im Code jetzt soweit wie folgt einschränken können:
Code:
UINT __stdcall CGenericServer::AcceptThread(LPVOID pParam)
{
CGenericServer *pGenericServer = (CGenericServer*)pParam;
SOCKET s; // Main Listen Socket
WORD wVersionRequested;
WSADATA wsaData;
sockaddr_in saLocal;
WSAEVENT Handles[2];
WSANETWORKEVENTS NetworkEvents;
sockaddr ClientAddr;
INT addrlen = sizeof(ClientAddr);
sockaddr_in sain;
char cAddr[50];
int result;
saLocal.sin_family = AF_INET;
saLocal.sin_port = htons(pGenericServer->m_ServerPort);
saLocal.sin_addr.s_addr = INADDR_ANY;
// Vorgabe für die Initialisierung der WinSockets zusammensetzen
wVersionRequested = MAKEWORD(2, 2);
// WinSockets initialisieren
result = WSAStartup(wVersionRequested, &wsaData);
if(result != 0)
{
TRACE("ERROR: WSAStartup(...) failure", "AcceptThread", result);
return THREADEXIT_SUCCESS;
}
// aktuelle Version der Sockets auf Version 2 überprüfen
if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
TRACE("ERROR: Requested Socket version not exist", "AcceptThread");
pGenericServer->CleanupThread(NULL, NULL, NULL);
return THREADEXIT_SUCCESS;
}
// Socket erzeugen
s = WSASocket(AF_INET, SOCK_STREAM, 0, (LPWSAPROTOCOL_INFO)NULL, 0, WSA_FLAG_OVERLAPPED);
if(s == INVALID_SOCKET)
{
TRACE("ERROR: WSASocket(...) failure", "AcceptThread", WSAGetLastError());
pGenericServer->CleanupThread(NULL, NULL, NULL);
return THREADEXIT_SUCCESS;
}
// Socket an die lokale Netzwerk-Adresse binden
result = bind(s, (struct sockaddr *)&saLocal, sizeof(saLocal));
if(result == SOCKET_ERROR)
{
pGenericServer->OnCleanupThread();
TRACE("ERROR: bind(...) failure", "AcceptThread", WSAGetLastError());
pGenericServer->CleanupThread(NULL, NULL, s);
return THREADEXIT_SUCCESS;
}
// Socket als Listener registrieren
try
{
// ###########################
// Hier kommt es zur Exception
// ###########################
result = listen(s, SOMAXCONN); // SOMAXCONN=5 (Maximum queue length specifiable by listen)
}
catch(...)
{
TRACE("ERROR: listen(...) failure", "AcceptThread", WSAGetLastError());
}
Leider durchblicke ich den Code auch nicht an allen Stellen zu 100%, habe ihn aber soweit wie hier dargestellt, kommentieren können


Gecatcht wird die Exception scheinbar leider auch nicht, d. h. das nachfolgende TRACE sehe ich nicht in der Konsole!! Allerdings läuft das Programm auch problemlos weiter (u. U. sogar mehrere Tage)!!
Hat irgendjemand schon mal ein gleichartiges Problem gehabt oder auch nur eine Idee, wie ich hier weiter vorgehen kann Bin leider mit meinem Latein ziemlich am Ende!
Danke und Gruß
Klaus
Zuletzt bearbeitet: