Date: Sat, 16 Nov 1996 15:13:04 -0500 (EST) From: "Marc G. Fournier" <scrappy@ki.net> To: hackers@freebsd.org Subject: Hate to ask more about sockets...but... Message-ID: <Pine.NEB.3.95.961116144609.7019A-100000@quagmire.ki.net>
next in thread | raw e-mail | index | archive | help
After the ... discussion(?) I started with my last question, I kind of hate to ask another one...but what the hell, here goes...:) I've taken most of the suggestions that were given at the beginning of the last discussion and improved (I think?) my code accordingly. But I'm still getting what seems to be a strange result, possibly because I've missed something...again. First off, the server opens a .jpg file, mmap's it, and sends it out through the socket: ----------------- if( (fd = open(TESTFILE, O_RDONLY)) != -1) { fstat(fd, &fi); fp = mmap(NULL, fi.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if(fp == (caddr_t) -1) { fprintf(stderr, "MMAP() failed\n"); exit(1); } close(fd); while(cnt-- != 0) { /* set to 1 for initial test */ start = time(0); nwritten = write(newsockfd, START, strlen(START)); if(nwritten < 0) { fprintf(stderr, "failed to write to socket: [%d bytes]\n", nwritten); exit(1); } nwritten = writen(newsockfd, fp, fi.st_size); if(nwritten < 0) { fprintf(stderr, "failed to write data to socket\n"); exit(1); } } } ----------------- On the client side, it reads the buffer until there is no data left: ----------------- char ptr[8192]; while(1) { n = read(sockfd, ptr, sizeof(ptr) - 1); if(n < 0) { fprintf(stderr, "error reading socket\n"); exit(0); } else if(n == 0) break; fprintf(stderr, "read %d(%d) bytes\n", bytes, n); write(STDOUT_FILENO, ptr, n); } ----------------- The 'fprintf' in client produces: read 46(46) bytes read 1486(1440) bytes read 9677(8191) bytes read 17868(8191) bytes read 26059(8191) bytes read 27340(1281) bytes And the server reports having written: 0= START: wrote [46] to socket WRITEN: bytes left to write == 27294 WRITEN: wrote 27294 bytes And the file being read in is: -rw-r--r-- 1 scrappy wheel 27294 Nov 9 00:23 ../public_html/POST4.JPG Great, this works...sort of. For some reason, the program reports that the read completed correctly, with the exact number of bytes read as I wrote to the socket, but I'm missing several lines out of the graphic when I view it. (check out http://www.ki.net/~scrappy/test.html, if you want to see what I mean by "missing several lines") If I change 'cnt' in the server to be 2 instead of 1, the graphic will come out completely...as if, for some reason, the last read didn't get written to the screen if it only 'scans' the file once. The other thing I found was weird was that if I changed the 'break' in the client side to a 'continue', so that it continued to scan the input socket for data (ie. await the next image to be send down the socket), I lost even more data from the image. I don't know if this makes any sense, or if there is enough data, but from everything I've been able to read, this *should* work...shouldn't it? Marc G. Fournier scrappy@ki.net Systems Administrator @ ki.net scrappy@freebsd.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.NEB.3.95.961116144609.7019A-100000>