11. februar 2003 - 23:34
Der er
22 kommentarer og 1 løsning
recv igen
Jeg havde spørgsmål
http://www.eksperten.dk/spm/316049 før, men accepterede lidt for tidligt et svar... jeg prøvede at bruge
char *buf;
int size = 10;
int recvLen = 0;
buf = malloc(size);
while( !recvLen && buf[recvLen] )
{
if(size-recvLen < 10)
{
buf = realloc( buf, size + 10 );
recvLen += recv(sock, buf+recvLen, size-recvLen, 0);
}
}
men nu får jeg en fejl ved buf = realloc( buf, size + 10 );
når jeg kompiler med g++. fejlen er cannot convert void* to char*..... øeh jeg er lidt lost her...
Annonceindlæg fra Cepheo
12. februar 2003 - 07:48
#1
Nogen som kan hjælpe en newbie?
12. februar 2003 - 08:34
#2
Der mangler et cast Prøv med recvLen += (char*)recv(sock, buf+recvLen, size-recvLen, 0);
12. februar 2003 - 08:53
#3
Du skylder mig 45 point
12. februar 2003 - 09:07
#4
Det er jo tydeligvis koden fra mit svar på 316049 du har gang i her, får man point hvis man svarer på det her spørgsmål phrame ?
12. februar 2003 - 09:35
#5
wendt har ret. Du skal type caste explicit til char *, fordi realloc returnerer void *. Men du bør nok overveje at omstrukturere koden lidt. Som den ser ud nu vil den: - gå i uendelig løkke hvis buf[0] != 0 - ikke læse noget hvis buf[0] == 0
12. februar 2003 - 14:58
#6
sorry for det sene svar... havde lige arbejde som skulle laves... men ja sloth det gør du....
12. februar 2003 - 14:59
#7
sorry sloth... jeg prøvede at få de andres løsning til at virke men det kunne jeg desværre ikke...
12. februar 2003 - 15:38
#8
prøv med følgende variant: char *buf; int size = 1000; int recvLen = 0; buf = malloc(size); int nb; while((nb = recv(sock, buf+recvLen, size-recvLen, 0)) >= 0) { recvlen += nb; if((size-recvLen) < 100) { buf = realloc(buf, size + 1000 ); size += 1000; } }
12. februar 2003 - 15:41
#9
Ja og så glemte jeg naturligvsi dit problem; altså: char *buf; int size = 1000; int recvLen = 0; buf = (char *)malloc(size); int nb; while((nb = recv(sock, buf+recvLen, size-recvLen, 0)) >= 0) { recvlen += nb; if((size-recvLen) < 100) { buf = (char *)realloc(buf, size + 1000 ); size += 1000; } }
12. februar 2003 - 16:03
#10
Hej Arne... Nu havner jeg bare i en uendelig løkke når jeg kommer ind i while-sætningen...
12. februar 2003 - 16:09
#11
Den løkke er baseret på at du vil læse hele input og så parse det bagefter. Hvis du vil have mulighed for at breake efter at have modtaget et eller andet, så kan du ligge et test ind. F.eks.: char *buf; int size = 1000; int recvLen = 0; buf = (char *)malloc(size); int nb; int i; while((nb = recv(sock, buf+recvLen, size-recvLen, 0)) >= 0) { recvlen += nb; for(i = (recvLen - nb); i < recvLen; i++) { if(buf[i]=='#') break; } if((size-recvLen) < 100) { buf = (char *)realloc(buf, size + 1000 ); size += 1000; } } den vil hoppe ud ligeså snart du har fået et '#' i input. Bemærk at du ikke kan regne med at den # vil være sidst i din buf selvom den er sendt sidst.
12. februar 2003 - 16:36
#12
Jeg prøvede at indsætte koden i mit eget... Men jeg bliver stadig inde i while-løkken... Jeg erstattede også # med \0, da det er der jeg ønsker at recv skal stoppe...
12. februar 2003 - 16:42
#13
Undskyld det er mig som er en tumbe. Den break hopper kun ud af for-løkken ikke ud af while løkken. :-( Vi prøver igen: char *buf; int size = 1000; int recvLen = 0; buf = (char *)malloc(size); int nb; int i; int done = 0; while(!done && (nb = recv(sock, buf+recvLen, size-recvLen, 0)) >= 0) { recvlen += nb; for(i = (recvLen - nb); i < recvLen; i++) { if(buf[i]=='#') done=1; } if((size-recvLen) < 100) { buf = (char *)realloc(buf, size + 1000 ); size += 1000; } }
12. februar 2003 - 22:35
#14
Den bliver stadig inde i while-løkken.... Jeg kan virkeligt ikke se logikken i det længere... lame as I am... :-) Her er koden for SEND i min client: char *message = "Jeg sidder her og kigger på skærmen og håber på det virker\n\0"; printf( "længden %d\n", strlen( message ) ); if( send( sockfd, message, strlen( message ), 0) == -1 ) perror( "send test string" ); Her er koden for RECV i min server: char *buf; int size = 1000, recvLen = 0, numBytes, i, done = 0; buf = (char*)malloc( size ); while( !done && ( (numBytes= recv(new_fd, buf+recvLen, size-recvLen, 0) )>=0 ) ) { recvLen += numBytes; for( i=(recvLen - numBytes); i<recvLen; i++ ) if( buf[ i ] == '\0' ) done = 1; if( (size-recvLen)<100 ) { size += 1000; buf = (char *)realloc( buf, size ); } } printf( "Virker Det? %s\n", buf );
12. februar 2003 - 22:37
#15
100 points ekstra til den som løser mit problem :-)
12. februar 2003 - 22:40
#16
jeg tilføjede nogle parenteser til while-sætninger, fordi den før var while(!done && (nb = recv(sock, buf+recvLen, size-recvLen, 0)) >= 0) og nu while( !done && ( (numBytes= recv(new_fd, buf+recvLen, size-recvLen, 0) )>=0 ) )
12. februar 2003 - 22:41
#17
kan det noget med at size i server delen er 1000?
12. februar 2003 - 22:48
#18
Nej at size sættes til 100 betyder ikke noget.
12. februar 2003 - 22:49
#19
Hov. if( send( sockfd, message, strlen( message ), 0) == -1 ) perror( "send test string" ); sender *ikke* en nul byte ! Det gør: if( send( sockfd, message, strlen( message ) + 1, 0) == -1 ) perror( "send test string" );
12. februar 2003 - 22:52
#20
også selvom nultermineringen er inkluderet i selv char arrayet?
12. februar 2003 - 22:53
#21
Hvis din string indeholde f.eks. 'a' 'b' 'c' '\0', så vil strlen returnere 3 og derfor vil send kun sende 'a' 'b' 'c' d.v.s. ingen '\0' !
12. februar 2003 - 22:54
#22
Juhuuuuuuuuuuuuuuuuuuuuuuuu.............. Es funjuniert.....
Kurser inden for grundlæggende programmering