Avatar billede phrame Nybegynder
11. februar 2003 - 11:26 Der er 25 kommentarer og
2 løsninger

recv

Heisan...

Jeg vil gerne have at min RECV skal blive ved med at receive indtil det møder en nulterminering af den. Men så vidt jeg kan se så sender SEND ikke en nulterminering eller gør den? Er der nogen som kan give nogle kode eksempler på hvordan jeg kan få den til at virke med en nul terminering....
Avatar billede arne_v Ekspert
11. februar 2003 - 11:34 #1
Nul bytes har ikke nogen speciel betydning i socket communication.

Det kan det ikke have da man skal kunne sende binære data med
nul bytes i.

Du bliver nødt til at bygge funktionaliteten ind i din
applikation d.v.s. at du send'er data+nul byte og recv'er
bytes og parser dem indtil nul byte.
Avatar billede phrame Nybegynder
11. februar 2003 - 11:34 #2
Her er noget af det kode jeg lavet....

int numbytes;
char buf[100];

if( (numbytes = recv( new_fd, buf, 100, 0)) == -1 ) {
perror( "recv" );
exit( 1 );
}

buf[ numbytes ] = '\0';
printf( "Received: %s\n", buf );

Jeg har brugt Beej simple client/server http://www.ecst.csuchico.edu/~beej/guide/net/bgnet.pdf som udgangspunkt til client server strukturen. Men så vidt jeg kan se så er det C, men jeg har tilføjet nogle ting til min egen kode og compilet det med g++ (jeg kører en linux-box)
Avatar billede arne_v Ekspert
11. februar 2003 - 11:34 #3
Bemærk at de fleste applikationer bruger <CR><LF> til at adskille
data med og ikke <NUL>.
Avatar billede soreno Praktikant
11. februar 2003 - 11:35 #4
Var det ikke bedre at blive ved med at modtage indtil der ikke kommer mere ?
Altså noget ala:

while(recv(remote_socket, (char *)buffer, packet_size, 0))  != 0)
{
  printf("%s\n", buffer);
}
Avatar billede hsloth Novice
11. februar 2003 - 11:37 #5
Du kan sådan set godt bruge nulterminering til at signalere slut, men du skal sørge for at inkludere nullet i den byte-strøm du sender :

void SendData( char *mesg ) // mesg er nultermineret
{
  // ved at lægge en til længden sikrer du dig at nullet også bliver sendt
  send(sock, mesg, strlen(mesg) + 1, 0);
}

void Recv()
{
  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);
  }
}
Avatar billede hsloth Novice
11. februar 2003 - 11:37 #6
Sku ha' været et svar :-)
Avatar billede arne_v Ekspert
11. februar 2003 - 11:38 #7
Du kan ikke regne med at hvis du send'er 3 klumper, så
recv'er du også 3 klumper.

Derfor er du nødt til at parse igennem det du recv'er.
Avatar billede phrame Nybegynder
11. februar 2003 - 11:41 #8
Tak arne... Det var det som var løsningen... Havde ikke lige tænkt på den sådan...
Avatar billede phrame Nybegynder
11. februar 2003 - 11:45 #9
Arne kom dog først med et svar... Men du får også lidt sloth
Avatar billede hsloth Novice
11. februar 2003 - 11:46 #10
Soreno>
Det kan man ikke lige, man resikere at der er nogle pakker i transit, således at man hopper ud af løkken uden at have fået al det data der er sendt
Avatar billede hsloth Novice
11. februar 2003 - 11:47 #11
Du bad om noget kode - det fik du ikke fra arnev, eller har jeg misset noget  :-(
Avatar billede phrame Nybegynder
11. februar 2003 - 11:51 #12
Sorry, men jeg nåede at indfører det i min egen kode inden jeg havde opdateret på siden igen, selvom svarene kom hurtigt... plus arne løsning passede perfekt ind i min egen kode....
Avatar billede phrame Nybegynder
11. februar 2003 - 11:51 #13
kom nu... jeg gav dig også 5 skånepoint...
Avatar billede soreno Praktikant
11. februar 2003 - 11:56 #14
hsloth >>
Fra dokumentationen for recv:
"If no incoming data is available at the socket, the recv() call waits for data to arrive unless the socket is non-blocking."

Så må det da være ok at bruge "sålænge recv ikke returnerer 0" (forudsat er der bruges en blocking TCP socket..) ?
Avatar billede arne_v Ekspert
11. februar 2003 - 12:30 #15
søren>

Det at recv blocker garanterer at der er nået et aller andet antal
bytes frem inden recv returnerer.

Det garanterer ikke, at alle bytes er nået frem inden recv
returnerer.

Med tilpas små data-mængder så vil alle data nok være nået
frem i praksis.

Men man bør alligevel lave sin kode så den er forberedt på
esktreme situationer.
Avatar billede soreno Praktikant
11. februar 2003 - 12:34 #16
Ok, så har jeg forstået det korrekt - det var bare den pastede kode som ikke var optimal.
Avatar billede hsloth Novice
11. februar 2003 - 13:04 #17
Soreno + arne_v>
Hvis du i din kode bruger en blocking socket vil du hænge i din while løkke indtil socketen bliver lukket, fra den anden ende - dette får recv til at returnere en negativ værdi - som din while betingelse vil fange, din kode vil derfor udskrive den sidst modtagne bid 2 gange.
Avatar billede arne_v Ekspert
11. februar 2003 - 13:15 #18
Det er selvfølgelig også en finesse.

Men hvad med din løkke ?
Avatar billede hsloth Novice
11. februar 2003 - 13:18 #19
arne_v >
Min løkke forudsætter at man bruger en non-blocking socket.
Derudover er der (mindst) en fejl i Recv() - skulle have været :

void Recv()
{
  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);
  }
}
Avatar billede hsloth Novice
11. februar 2003 - 13:19 #20
arne_v - fortsat>
Pokkers - koden smuttede ind inden jeg var færdig med at editere :
void Recv()
{
  char *buf;
  int size = 10;
  int recvLen = 0;
  buf = malloc(size);
  while( !recvLen && buf[recvLen] )
  {
      if(size-recvLen < 10)
      {
        size += 10;
        buf = realloc( buf, size );
      }
      recvLen += recv(sock, buf+recvLen, size-recvLen, 0);
  }
}
Avatar billede arne_v Ekspert
11. februar 2003 - 13:23 #21
Min pointe var at det ikke var løkken men recv/send der var
"the issue".
Avatar billede arne_v Ekspert
11. februar 2003 - 13:27 #22
PS: Jeg tror iævrigt stadigvæk der er problemer med din løkke !
    Vil testet !recvLen ikke returnerer false ligeså snart der
    er læst noget ?
Avatar billede hsloth Novice
11. februar 2003 - 13:27 #23
arne_v>
Så har jeg vist misset din pointe : "Men hvad med din løkke ?"
Avatar billede arne_v Ekspert
11. februar 2003 - 13:30 #24
Det var bare et lille hip til at du var så meget efter sørens løkke.
Avatar billede hsloth Novice
11. februar 2003 - 13:34 #25
arne_v>
Jeg var ikke "efter" soreno's løsning - jeg synes bare han skulle have hele historien om blocking og non-blocking sockets
Avatar billede arne_v Ekspert
11. februar 2003 - 13:36 #26
OK. blocking versus non-blocking er særdeles relevant.
Avatar billede hsloth Novice
11. februar 2003 - 13:38 #27
Thanx
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