|
| Linux: Sockets, recv og select Fra : Jens |
Dato : 29-06-03 20:07 |
|
Hej Alle Sammen
Jeg sidder her og forsøge at skrive en funktion, som skal sikker
at jeg har modtaget alt sendt data fra en server.
Jeg kan blot ikke få det til at virke:
Her er koden.
string hent_post::recvall(int socket ,char* mbuf, int buffer_size, int flag)
{
// Variabler
fd_set rfds;
struct timeval tv;
int data_klar;
int bytes_modtaget;
string data;
// Sætter til non block
fcntl(sock, F_SETFL, O_NONBLOCK);
// Vent i op til 1 sek.
tv.tv_sec = 1;
FD_ZERO(&rfds);
FD_SET(socket, &rfds);
if(select(socket+1, &rfds, NULL, NULL, &tv))
do
{
data += mbuf;
mbuf[0]= '\0';
bytes_modtaget = recv(sock, mbuf, 1500, 0);
mbuf[bytes_modtaget]='\0';
}while (bytes_modtaget != -1);
return data;
}
Men stadig væk modtager jeg ikke alt den data. som server sender.
bytes_modtaget modtaget bliver -1, hvis der blot er den midste ophold
fra serveren side.
Jeg ville gerne have select inden recv, men når jeg så kalder funktionen
igen. Så sker der ikke noget.
Jeg håber at nogle kan se hvad jeg gør galt.
Mvh.
Jens
| |
Kent Friis (29-06-2003)
| Kommentar Fra : Kent Friis |
Dato : 29-06-03 20:31 |
|
Den Sun, 29 Jun 2003 21:07:13 +0200 skrev Jens:
>
>
> if(select(socket+1, &rfds, NULL, NULL, &tv))
> do
> {
> data += mbuf;
> mbuf[0]= '\0';
> bytes_modtaget = recv(sock, mbuf, 1500, 0);
> mbuf[bytes_modtaget]='\0';
>
> }while (bytes_modtaget != -1);
>
> return data;
>}
>
>
>Men stadig væk modtager jeg ikke alt den data. som server sender.
>bytes_modtaget modtaget bliver -1, hvis der blot er den midste ophold
>fra serveren side.
Du skal have select() ind i din while-løkke, så den venter på flere
data hver gang, i stedet for kun første gang.
Hvis du ikke venter på data, så vil den forsøge at læse med det samme,
og returnere -1 "Jeg har ikke modtaget noget endnu".
Mvh
Kent
--
If you think about it, Windows XP is actually the OS that
started as "Microsoft OS/2 NT 3.0"
| |
|
|