Avatar billede Slettet bruger
11. oktober 2007 - 00:43 Der er 8 kommentarer og
1 løsning

recv() hænger

Jeg har sat mit program til at lytte på en port og tage imod indkommende forbindelser. Når jeg prøver at læse fra den åbnede forbindelse, bliver den sidste recv() aldrig færdig, da browseren ikke sender mere data.

while(recv(connectSocket,line,100,0)) {
  cout << "læst: " << line << "\n";
}

Hvordan kommer jeg videre? Jeg har også prøvet read() og med sizeof(line).
Avatar billede arne_v Ekspert
11. oktober 2007 - 02:07 #1
prøv noget a la:

int n;
char buf[100];
while((len = recv(sd, buf, sizeof(buf), 0)) > 0)
{
  buf[len] = '\0';
  cout << buf << endl;
}

når client closer socket bør den ryge ud af while løkken.
Avatar billede Slettet bruger
11. oktober 2007 - 17:27 #2
Nej desværre, den hænger stadig.

I perl klarede jeg dette problem ved at hente én linje ad gangen, og hvis linjen var "\r\n\r\n", så stoppede jeg loopen.

Er det muligt at hente én linje ad gangen i C++?

Og noget helt andet, hvor h****** retter eksperten.dk ikke den fejl, at kommentarer/svar ikke gemmes, hvis man er lang tid om at skrive dem?
Avatar billede arne_v Ekspert
14. oktober 2007 - 05:25 #3
Den skal afslutte, når client afslutter forbindelsen.

Men hvis du gerne vil process noget når du har modtaget \r\n\r\n, så skal du lave noget a la:

int lenn,ix;
char buf[10000];
ix = 0;
while((len = recv(sd, buf + ix, sizeof(buf) - ix, 0)) > 0)
{
  ix += len;
  if(strnstr(buf, "\r\n\r\n", ix) != NULL) break;
}
buf[ix] = '\0';
// process første del af buf - husk at gem sidste del af buf
Avatar billede Slettet bruger
15. oktober 2007 - 00:21 #4
Det giver mig denne fejl:

error: âstrnstrâ was not declared in this scope
Avatar billede arne_v Ekspert
15. oktober 2007 - 02:37 #5
Den er vist ikke standard.

Så prøv:

int lenn,ix;
char buf[10000];
ix = 0;
while((len = recv(sd, buf + ix, sizeof(buf) - ix, 0)) > 0)
{
  ix += len;
  buf[ix] = '\0';
  if(strstr(buf, "\r\n\r\n") != NULL) break;
}
// process første del af buf - husk at gem sidste del af buf
Avatar billede Slettet bruger
15. oktober 2007 - 10:18 #6
Også fejl:

error: no matching function for call to âstrstr(char [10000], const char [5], int&)â
/usr/include/string.h:195: note: candidates are: char* strstr(const char*, const char*)
/usr/include/c++/4.2/cstring:125: note:                char* std::strstr(char*, const char*)
Avatar billede arne_v Ekspert
15. oktober 2007 - 15:03 #7
Kun 2 argumenter til strstr !
Avatar billede Slettet bruger
15. oktober 2007 - 15:31 #8
Undskyld, og tak, nu virker det :) smid du bare et svar.
Avatar billede arne_v Ekspert
15. oktober 2007 - 16:04 #9
svar
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