Avatar billede phrame Nybegynder
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...
Avatar billede phrame Nybegynder
12. februar 2003 - 07:48 #1
Nogen som kan hjælpe en newbie?
Avatar billede wendt Nybegynder
12. februar 2003 - 08:34 #2
Der mangler et cast
Prøv med recvLen += (char*)recv(sock, buf+recvLen, size-recvLen, 0);
Avatar billede hsloth Novice
12. februar 2003 - 08:53 #3
Du skylder mig 45 point
Avatar billede hsloth Novice
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 ?
Avatar billede arne_v Ekspert
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
Avatar billede phrame Nybegynder
12. februar 2003 - 14:58 #6
sorry for det sene svar... havde lige arbejde som skulle laves... men ja sloth det gør du....
Avatar billede phrame Nybegynder
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...
Avatar billede arne_v Ekspert
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;
  }
}
Avatar billede arne_v Ekspert
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;
  }
}
Avatar billede phrame Nybegynder
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...
Avatar billede arne_v Ekspert
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.
Avatar billede phrame Nybegynder
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...
Avatar billede arne_v Ekspert
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;
  }
}
Avatar billede phrame Nybegynder
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 );
Avatar billede phrame Nybegynder
12. februar 2003 - 22:37 #15
100 points ekstra til den som løser mit problem :-)
Avatar billede phrame Nybegynder
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 ) )
Avatar billede phrame Nybegynder
12. februar 2003 - 22:41 #17
kan det noget med at size i server delen er 1000?
Avatar billede arne_v Ekspert
12. februar 2003 - 22:48 #18
Nej at size sættes til 100 betyder ikke noget.
Avatar billede arne_v Ekspert
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" );
Avatar billede phrame Nybegynder
12. februar 2003 - 22:52 #20
også selvom nultermineringen er inkluderet i selv char arrayet?
Avatar billede arne_v Ekspert
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' !
Avatar billede phrame Nybegynder
12. februar 2003 - 22:54 #22
Juhuuuuuuuuuuuuuuuuuuuuuuuu..............  Es funjuniert.....
Avatar billede phrame Nybegynder
12. februar 2003 - 22:57 #23
Arne... surf lige hen til http://www.eksperten.dk/spm/316766 ..... Der ligger noget til dig...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester