webForumDet fria alternativet

Datautväxling via sockets i c

5 svar · 370 visningar · startad av Nickemannen

NickemannenMedlem sedan aug. 20003 575 inlägg
#1

Vi skall skapa ett nätverksprotokoll för en stor olika data som skall skickas.

Vi kom och tänka på att själva nätverksprotokollet kan se ut såhär.

Vi har en flera olika structs som vi definerar på klienten och servern.

Klienten skickar en struck och en defined siffra vilket gör att mottagaren kan avgöra vilken struct det är. Det handlar om mottagarsidan typecastar det mottagna till den structen som angetts från defined siffran.

Protokollet kommer då att se ut liknande

c: Hello
s: hello_connection_established
c: sendstructtype 1
s: ok_send
c: [Skickar struct]
s: ok_recive_done
c: bye
s: closing_connection

Skulle detta fungera eller hur borde det se ut?

Eftersom det är så mycket olika data som skall överföras så kan det bli jobbigt att ha ett protokoll för varje struct?

Förslag önskas?

NickemannenMedlem sedan aug. 20003 575 inlägg
#2

Jag hittade denna länken:
http://www.gamedev.net/community/forums/topic.asp?topic_id=297087
Där dom diskuterade att det gick men att man helst inte skulle skicka hela structs utan skicka en struct med

id, length, char[].

Men eftersom vårat system inte skall skicka större saker än en struct med kanske en x-position och en y-position. Borde man ändå dela upp packeten :S.

NickemannenMedlem sedan aug. 20003 575 inlägg
#3

Som t.ex. här

struct a_msg
{
	short ID;
	unsigned short length;
	char message[BUFFERSIZE];
	int bytes_pending;
};
int SendData(a_msg * data)
	{
		//
		// Send data to the server
		//
		if(isconnected)
		{
			nRet = send(theSocket, (char *)data, HEADERSIZE+data->length, 0);
			if (nRet == SOCKET_ERROR)
			{
				//cout<<"socket error on send"<<endl;
				closesocket(theSocket);
				isconnected=false;
				return -1;
			}
			return 1;
		}
		else
		{
			//printf("not connected\n");
			return -2;
		}
	}
UlfTMedlem sedan maj 20018 027 inlägg
#4

Nickemannen skrev:

Där dom diskuterade att det gick men att man helst inte skulle skicka hela structs

Jag förstod det som att man inte ska skicka objekt:

You should only be sending data across the wire. Not entire objects.

Det är ju naturligt, eftersom mottagaren knappast kan veta vilka medlemsfunktioner objekten har, etc.

Nickemannen skrev:

utan skicka en struct med

id, length, char[].

Id i structen skulle du kunna använda för att ange vad det är för typ av struct du skickar över. Dvs du skickar både struct och structtyp på samma gång. Om du bygger upp alla structtyper på ett sådant vis att du alltid har id i samma del av structen (i början, förslagsvis), kan du alltid läsa av id innan du vet vad det är du har tagit emot. Då har du sluppit ett steg i kommunikationen med servern.

PeWMedlem sedan juni 200010 432 inlägg
#5

Där dom diskuterade att det gick men att man helst inte skulle skicka hela structs

En struct är detsamma som en sekvens med data precis som en array, fast med inbyggt 'offset'. Så det bör ju inte bereda några somhelst problem att skicka structs så länge client och server är ense med hur structen är definierad, eller hur?

Övriga tips (fr. avsnitt 6.3 och framåt):
http://www.ecst.csuchico.edu/~beej/guide/net/html/advanced.html

NickemannenMedlem sedan aug. 20003 575 inlägg
#6

Jepp, tanken var den att båda sidorna skall ha en likadan struct definerad.

Tack för länken PeW skall läsa.

Är det såhär kommunikation går till eller är det stora protokoll som byggs? Där varje liten del har sitt kommando i protokollet?

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)