webForumDet fria alternativet

Sockets överföring

4 svar · 258 visningar · startad av Nickemannen

NickemannenMedlem sedan aug. 20003 575 inlägg
#1

Hej jag har har lite problem med sockets.

Jag har en som sänder och en som lyssnar.

Socketen kanalen är öppen hela tiden.

Och det är bara en som skickar hela tiden.

Jag har satt storlek på buffer och vart buffern skall ligga.

Jag skickar alltid en data sträng som har en bestämd storlek.

Så fort den går förbi recv så har den "oftast" fyllt bufferten.

Säg att den tar emot paket 1 = 256 k
2 = 256 k
3 = 256 k

Men helt plötsligt ibland så delas ett paket upp
4 = 136 k
5 = 120 k

Eftersom jag hanterar varje datapaket på ett speciellt sätt så leder detta till ett fel. Hur kan jag lösa detta?

for (;;) {

char *message = malloc(sizeof(DataPacket));

i = recv(fd_connection, &message, sizeof(DataPacket),0);		
printf("reciving: %d \n",i); 
if(i == 0) {
	return NULL;
}

distrSocketMessageHandler(message);
}

Skall man t.ex. räkna på mottagna byte i "i" och börja så långt fram i bufferten och läsa in nästa gång om det inte överstiger det antal tecken som krävs för ett "DataPacket"

PeWMedlem sedan juni 200010 432 inlägg
#2

Jag rekommenderar http://www.ecst.csuchico.edu/~beej/guide/net/
Där tror jag att det finns förklaringar och exempel på hur man undviker ditt problem. Kolla under avancerat.

Sang-draxMedlem sedan juli 2002581 inlägg
#3

Om du kopplar upp via TCP (vilket det verkar som då du pratar om 'kanaler') kan du inte på något sätt tänka på datan som uppdelad i paket.
TCP tillhandahåller en ström av data, som kan komma en byte i taget eller flera megabyte i taget. Garanterat är dock att datan kommer att komma fram i den ordning den skickades.

NickemannenMedlem sedan aug. 20003 575 inlägg
#4

PeW skrev:

Jag rekommenderar http://www.ecst.csuchico.edu/~beej/guide/net/
Där tror jag att det finns förklaringar och exempel på hur man undviker ditt problem. Kolla under avancerat.

Det var mycket bra läsning men orsaken är ju inte att send inte fungerar för den skickar den sista delen.

Det är det att när den tar emot så delar den upp paketen.

Men skall testa att ändra send sidan.

// Red det fungerade inte bättre med hans lösning.

Det är en liknande lösning på recv sidan jag är ute efter.

NickemannenMedlem sedan aug. 20003 575 inlägg
#5

Lösning:

int total = 0; 
		int bytesleft = sizeof(DataPacket); // how many we have left to send
		int n = 0;
		
		
		while(total < sizeof(DataPacket)-1) {
			n = recv(fd_connection, message+total, bytesleft,0);
			if (n == -1) { break; }
			total += n;
			bytesleft -= n;
			if(n == 0) {
				return NULL;
			}
		}
129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)