c - Send/Read using a TCP socket, anomalies in the byte sizes -


i'm trying implement working http client-server application make practice network programming.
2 programs have follow basic algorithm:
client - send request
server - send "+ok\r\n"
server - send file size in bytes
server - send file
client - send ack

i'm having lot of troubles in reading part, because perform dirty read on stream.

these 2 reading function i'm using:

/* reads line stream socket s buffer ptr line stored in ptr including final '\n' @ maxlen chasracters read*/ int readline (socket s, char *ptr, size_t maxlen) {     size_t n;     ssize_t nread;     char c;      (n=1; n<maxlen; n++)     {         nread=recv(s, &c, 1, 0);         if (nread == 1)         {             *ptr++ = c;             if (c == '\n')                 break;         }         else if (nread == 0)    /* connection closed party */         {             *ptr = 0;             return (n-1);         }         else            /* error */             return (-1);     }     *ptr = 0;     return (n); } 

and:

int readnumber(socket s, long *num, int maxread) {     size_t n;     ssize_t nread;     int totread;     long number=0;     (n=1; n<maxread+1; n++)     {         nread=recv(s, &number, sizeof(number), 0);         if (nread == sizeof(number))         {             totread+=nread;             *num = number;         }         else if (nread == 0)    /* connection closed party */         {             *num = 0;             return (n-1);         }         else            /* error */         {             printf("nread = %d\n", nread);             return (-1);         }     }     return (totread); } 

this snippet of main receive +ok message , file size:

    memset(rbuf,0,sizeof(rbuf));     //rbuf buffer store read     printf("waiting response...\n");     result = readline(s, rbuf, sizeof(rbuf));  //reading function above     printf("byte read(okmsg) = %d\n", result);     if (result <= 0)       //error management     {          printf("read error/connection closed\n");            closesocket(s);          sockcleanup();          exit(1);     }     else     {         long filelength=0;         unsigned char *fbuf;         //receive ok         if(!strcmp(rbuf,"+ok\r\n"))         {             puts("+ok\n");             //receive file len             int nw = readnumber(s, &filelength, 1);  //reading function above             printf("byte read(fdim) = %d\n", nw);             printf("file %ld bytes long\n", filelength);             if(nw >0)             {                 // receive file              }         }     } 

when send "+ok\r\n" string server tells me sends 8 bytes, when read find '\0' char after 6 bytes. way reads correctly message, when try read file size (that long) gives me wrong number.
opinion stream buffer dirty, , i'm reading 2 bytes not part of file size, i'm not understanding why happens.

please ask me more info if i'm not clear enough.

solved:
thank answers!!! put me in right mindset understand wrong.
problem declaration in server:

char *okmsg = "+ok\r\n"; 

instead of

char okmsg[] = "+ok\r\n"; 

that lead me undefined behavior.

long number=0; (n=1; n<maxread+1; n++) {     nread=recv(s, &number, sizeof(number), 0); 

you forgot design , implement protocol carry data between server , client. because tcp provides stream of bytes, protocol should defined stream of bytes.

how many bytes convey number? "however many bytes 'long' happens occupy on platform" answer? what's semantic meaning of first byte? "whatever first byte of 'long' happens mean on platform" answer?

a good answer be, "the size shall conveyed 4-byte unsigned integer in little-endian byte order". make absolutely sure code sends , receives in format.


Comments

Popular posts from this blog

windows - Single EXE to Install Python Standalone Executable for Easy Distribution -

c# - Access objects in UserControl from MainWindow in WPF -

javascript - How to name a jQuery function to make a browser's back button work? -