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
Post a Comment