webForumDet fria alternativet

Problem med asynchronous sockets

C/C++

0 svar · 162 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#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;
}
391 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
256 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
259 ms — ändringar (db)