webForumDet fria alternativet

Problem med asynchronous sockets

0 svar · 162 visningar · startad av Alpha II

Alpha IIMedlem sedan maj 20002 579 inlägg
#1

Japp, som rubriken säger har jag lite problem här!

Jag sitter o programmerar på mitt första nätverksspel någonsin och även första gången jag har använt winsock.

Problemet är att det verkade som om inte alla paket kom fram. De kom fram om jag satt o steppade igenom hela programmet i debuggern men inte annars. Jag läste då på en sida att problemet med asynchronous sockets är att de returnerar WSAEWOULDBLOCK om man just använt dem och att man därför måste förska om och om igen tills det fungerar.

Jag försökte då lösa det genom att loopa tills de inte var upptagna men loopen avslutas aldrig, dvs de är upptagna hela tiden dock inte när jag steppar i debuggern.

Här är koden jag använder för att skicka data:

void CSocket::SendData(char *message, unsigned long length)
{
	unsigned long messageSize = length;

	messageSize = htonl(messageSize);

	if (send(sock, (char *)&messageSize, sizeof(messageSize), 0) == SOCKET_ERROR)
	{
		if (WSAGetLastError() == WSAEWOULDBLOCK)
		{
			Sleep(750);
			SendData(message, length);
		}
		return;
	}

	messageSize = ntohl(messageSize);

	while (1)
	{
		if (send(sock, message, length, 0) == SOCKET_ERROR)
		{
			if (WSAGetLastError() == WSAEWOULDBLOCK)
			{
				Sleep(750);
				continue;
			}
			else
			{
				return;
			}
		}
		else
		{
			break;
		}
	}
}

... och för att ta emot:

int CSocket::GetData(char* dest)
{
    int bytes;
	unsigned int messageSize;

	bytes = recv(sock, (char *)&messageSize, sizeof(messageSize), 0);
	if (bytes == SOCKET_ERROR)
	{
		if (WSAGetLastError() == WSAEWOULDBLOCK)
		{
			Sleep(750);
			GetData(dest);
		}
		return 0;
	}

	messageSize = ntohl(messageSize);

	while (1)
	{
		bytes = recv(sock, dest, messageSize, 0);
		if (bytes == SOCKET_ERROR)
		{
			if (WSAGetLastError() == WSAEWOULDBLOCK)
			{
				Sleep(750);
				continue;
			}
			else
			{
				return 0;
			}
		}
		else
		{
			break;
		}
	}

    return bytes;
}
Genererad på 381 ms · cache AV · v20260730165559-full.f96bc7eb