[WinSock] Zamknięcie klienta powoduje zamknięcie serwera

0

Problem śmieszny... Po podłączeniu się klienta do serwera przez socket przy zamykaniu klienta dosłownie zabijany jest proces serwera - nie kończy się on normalnie. Czegoś pewnie z WSA nie rozumiem...

Serwer to standardowe otwarice socketu, nie ma tam nic nadzwyczajnego. W kliencie:

case ID_CONNECT:
				if(!isConnected)
				{
					WSAStartup(versionRequested, &wsadata);
					s = socket(AF_INET, SOCK_STREAM, 0);
					if(s == INVALID_SOCKET) return 0;
					unsigned long server_addr = inet_addr("127.0.0.1");
					if(server_addr == INADDR_NONE) MessageBox(hwnd, "Niepoprawny adres IP", "Łączenie z serwerem", MB_OK|MB_ICONSTOP);
					memset(&addr, 0, sizeof(addr));
					addr.sin_family = AF_INET;
					addr.sin_port = htons(23);
					addr.sin_addr.s_addr = server_addr;
					
					if(connect(s, (struct sockaddr*) &addr, sizeof(addr))) MessageBox(hwnd, "Nie można było ustanowić połączenia z serwerem", "Łączenia z serwerem", MB_OK|MB_ICONSTOP);
					else isConnected = true;
				} else MessageBox(hwnd, "Jesteś już połączony!", "Status", MB_ICONINFORMATION|MB_OK);
				break;
case WM_DESTROY:
		if(MessageBox(hwnd, "Pewien?\nBędzie smutno ;(", "Koniec bazgrania", MB_ICONQUESTION | MB_YESNO) == IDYES)
		{
			if(isConnected)
			{
				closesocket(s);
				WSACleanup();
			}
			PostQuitMessage(0);
		}
		break;

Co jest nie tak?

0

jezeli serwer ci sie wywala to znaczy ze tam masz blad.

0

strzelam:
w kodzie serwera, w miejscach gdzie zachodzi komunikacja (send/recv) nie sprawdzasz co te funkcje zwracaja. w momencie zerwania polaczenia, zaczynaja one zwracac -1 (czyli blad komunikacji) a kod to dalej traktuje jako ilosc bajtow odebranych (jako -1 albo 4294967295, zalezy czy uzywasz signed czy unsigned) i podczas proby uzycia tego jako offsetu do bufora powstaje accessviolation ktory wywala caly proces serwera

1 użytkowników online, w tym zalogowanych: 0, gości: 1