Segmentation Fault bei closesocket
-
Hallo zusammen,
ich habe einen (Server)Socket mit bind, listen und accept aufgemacht.
Jetzt möchte ich den Socket schließen. Da der Socket aber blockiert ist
und auf die nächste Connection wartet, möchte ich ihn in einem anderen
Thread schliessen. Das mache ich mit closesocket. Aber genau in der
Zeile kriege ich ein Segmentation fault, der nix mit der socket_id zu tun hat.
Ich vermute, dass er den Socket erfolgreich schließt und dann in
dem blockierten Thread der Zugriffsfehler auftritt...
Sowohl bei listen als auch bei accept schmeiße ich bei Rückgabewert -1 eine
Exception, die dann ganz oben in meiner Thread-Klasse (,die ich schon
häufiger verwendet habe) gefangen wird. Kann irgendwo innerhalb der
accept oder bind-Methode ein Segmentation fault auftreten?Muß ich den Socket vielleicht durch eine andere Methode schließen?
Gruß,
*Cpp-Anfänger*
-
Folgendes geht bei mir Problemlos:
#include <winsock2.h> #include <stdio.h> #include <tchar.h> #pragma comment(lib, "Ws2_32.lib") SOCKET ListenSocket; BOOL WINAPI CtrlHandlerRoutine( DWORD dwCtrlType ) { closesocket(ListenSocket); return TRUE; } int _tmain() { SetConsoleCtrlHandler(CtrlHandlerRoutine, TRUE); //---------------------- // Initialize Winsock. WSADATA wsaData; printf("Initializing wsock..."); int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != NO_ERROR) { printf("Error at WSAStartup()\n"); return 1; } printf(" Ok\n"); //---------------------- // Create a SOCKET for listening for // incoming connection requests. printf("Creating socket..."); ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (ListenSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return 2; } printf(" Ok\n"); //---------------------- // The sockaddr_in structure specifies the address family, // IP address, and port for the socket that is being bound. sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr("127.0.0.1"); service.sin_port = htons(27015); printf("Binding to port..."); if (bind( ListenSocket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR) { printf("bind() failed.\n"); closesocket(ListenSocket); WSACleanup(); return 3; } printf(" Ok\n"); //---------------------- // Listen for incoming connection requests. // on the created socket printf("Start listening..."); if (listen( ListenSocket, 1 ) == SOCKET_ERROR) { printf("Error listening on socket.\n"); closesocket(ListenSocket); WSACleanup(); return 4; } printf(" Ok\n"); //---------------------- // Create a SOCKET for accepting incoming requests. SOCKET AcceptSocket; printf("Waiting for client to connect...\n"); //---------------------- // Accept the connection. while(1) { AcceptSocket = SOCKET_ERROR; while( AcceptSocket == SOCKET_ERROR ) { AcceptSocket = accept( ListenSocket, NULL, NULL ); if (AcceptSocket == SOCKET_ERROR) { DWORD dwErr = WSAGetLastError(); printf("accept returned: %d, ERR: %d\n", AcceptSocket, dwErr); if (dwErr == WSAEINTR) break; } } // while if (AcceptSocket != SOCKET_ERROR) { printf("Client connected.\n"); ListenSocket = AcceptSocket; } break; } WSACleanup(); return 0; }
-
Danke Jochen.
Leider liegt es nicht an dem Socket.
Ich glaub ich hab ein Problem mit dem
thread-safe exception handling obwohl ich mit -mthreads (MinGW)
gelinkt habe...
Ich hab meine Klasse in eine dll ausgelagert, die ich auch mit
-mthreads gelinkt habe.Naja...
Trotzdem VIELEN DANK