Empfangspuffer für TCP- bzw- UDP-Sockets dimensionieren.

Hallo Tikonteroga

Du gehst das ganze falsch an. TCP-Pakete müssen dich nicht interessieren. Für dich muss das ganze nur einfach ein Datenstrom sein bei der die eine Seite einfach ausliest (ohne zu wissen, was die andere Seite macht) und die andere einfach reinschreibt.

Wenn du auf einer Seite recv aufrufst hat das was du zurückbekommst überhaupt nichts mit dem zu tun, was du gesendet hast (ausser natürlich, dass du nicht mehr bekommen kannst als schon gesendet wurde). Sonst gibt es keinen Zusammenhang zwischen send und receive.

Zu deinen Fragen:
1. Nein
2. Nein, du hast nirgendwo Einfluss auf die einzelnen Pakete
3. Das ist für dich nicht relevant. Von dem Moment an in dem du send aufrufst bis du am anderen Ort recv aufrufst hast du keinen Einfluss auf die Daten. Diese werden nach Laune des Treibers in Pakete verteilt.

Wie gesagt, mach dir das Leben nicht selber schwer, arbeite hier einfach mit einem Stream, völlig losgelöst von Lowlevel-Angelegenheiten.

C:
typedef struct tTcpPacket {
	unsigned short size;
	unsigned short counter;
	unsigned char* data;
} TcpPacket;

unsigned short readShort(SOCKET s) {
	unsigned short retVal = 0;
	unsigned char* curPtr = (unsigned char*) &retVal;
	unsigned int bytesRead = 0;
	int chunk;

	while (bytesRead < sizeof(unsigned short)) {
		chunk = recv(s, curPtr + bytesRead, sizeof(unsigned short) - bytesRead, 0);
		if (chunk <= 0) {
			// error
		}

		bytesRead += chunk;
	}

	return retVal;
}

void receivePacket(SOCKET s, TcpPacket* outPacket) {
	unsigned char* curPtr = NULL;
	unsigned int bytesRead = 0;
	int chunk = 0;

	outPacket->size = readShort(s);
	outPacket->counter = readShort(s);

	outPacket->data = (unsigned char*) malloc(outPacket->size);
	curPtr = outPacket->data;

	while (bytesRead < outPacket->size) {
		chunk = recv(s, curPtr + bytesRead, outPacket->size - bytesRead, 0);
		if (chunk <= 0) {
			// error
		}

		bytesRead += chunk;
	}
}

Viele Grüsse
Cromon
 
Zurück