Socket Web Server - No Images?
I wrote a basic web server using Winsocket/BSD Sockets for my mmorpg and it displays html files perfectly with one exception, there are no images. What do I need to do in order to get them to be displayed? Is it a content type issue? Thanks in advance. [Edited by - DarkHacker on February 7, 2005 12:29:41 PM]
I'm sending the content-length and the content-type now, opening up any non text file in binary and then reading it one byte at a time. Instead of a timeout with an eventual "This image is broken" error now it appears like it's a broken image since it's displaying the can't find the image picture in it's place.
Any ideas?
[Edited by - DarkHacker on February 7, 2005 12:11:08 PM]
Any ideas?
[Edited by - DarkHacker on February 7, 2005 12:11:08 PM]
Debug it like you would debug anything else: isolate it to small, individually testable parts.
Can you get an image (without the HTML) in a browser?
Can you get an image file using "wget" on the command line?
Is it exactly the same as the file you initially served? If not, what corrupted it?
Run Ethereal on your browser getting a real image from a real web server, and compare to yours. What's different that would be interesting?
By the way: serving a single byte at a time is a bad idea. You want to read and write large-ish blocks for performance.
Can you get an image (without the HTML) in a browser?
Can you get an image file using "wget" on the command line?
Is it exactly the same as the file you initially served? If not, what corrupted it?
Run Ethereal on your browser getting a real image from a real web server, and compare to yours. What's different that would be interesting?
By the way: serving a single byte at a time is a bad idea. You want to read and write large-ish blocks for performance.
enum Bool { True, False, FileNotFound };
Thanks for the tips. I've got it to have the correct width of the image now, but the height is really big and there still isn't an image just the default broken image.
When viewed without the html its only a couple pixels wide and about half as long of a broken image in comparison when it's viewed using html.
Wget says there's a read error at the first byte but it connects fine.
The reason I was only doing 1 byte at a time was for debugging purposes, since I actually get a Mozilla error: "The image cannot be displayed, because it contains errors" when doing it with 1 byte.
It's a very strange error.
When viewed without the html its only a couple pixels wide and about half as long of a broken image in comparison when it's viewed using html.
Wget says there's a read error at the first byte but it connects fine.
The reason I was only doing 1 byte at a time was for debugging purposes, since I actually get a Mozilla error: "The image cannot be displayed, because it contains errors" when doing it with 1 byte.
It's a very strange error.
I'm opening it like this:
sendP is just a wrapper for send so I dont have to have the size parameter, it just does a size of before it sends.
[Edited by - DarkHacker on February 7, 2005 2:55:27 PM]
if (!arrContentType[idx].binary) inputFile.open(fileName.c_str()); else inputFile.open(fileName.c_str(),ios::binary); if (!inputFile.is_open()) { sendErrorP(socket, "The file (" + fileName + ") you requested does not exist, check your url"); inputFile.close(); return 404; } stat(fileName.c_str(),&results); sendP(socket,"HTTP/1.1 200 OK\nConnection: close\nContent-Type: " + arrContentType[idx].contentType + "\nContent-Length: " + stos((short)results.st_size) + "\r\n\r\n"); if (!arrContentType[x].binary) { while(!inputFile.eof()) { inputFile.getline(aBuf,255); sendP(socket,aBuf); } } else { for (unsigned short x = 0; x < (unsigned short)results.st_size;x++) { inputFile.read(bBuf,1); sendP(socket,bBuf); } } inputFile.close();
sendP is just a wrapper for send so I dont have to have the size parameter, it just does a size of before it sends.
[Edited by - DarkHacker on February 7, 2005 2:55:27 PM]
Quote:
Wget says there's a read error at the first byte but it connects fine.
That's a clue right there.
First, make sure that you actually take the "binary" path in your code. Insert logging or breakpoints or whatever.
Second, the header fields should be separated by \r\n, not just \n.
Third, get Ethereal (it's free) and compare your program, with a real server. Really.
Also, why is there an array of elements? In HTTP, each element is its own request. Are you perhaps only serving pre-loaded items, and calculate the index into the array based on the request parameters? If so, are you sure the right thing is being served? Again, insert logging into your code to see that the right thing happens.
enum Bool { True, False, FileNotFound };
After some testing it is going down the binary path. I updated the header fields, thanks for that info.
The array holds the content-types, like "image/gif" or "text/html". A couple lines above the code I showed it matches the file extension to the content type that's defined in a seperate file. A lot like the AddType command in Apache's conf files.
I'm getting Ethereal right now I'll report back on my findings.
The array holds the content-types, like "image/gif" or "text/html". A couple lines above the code I showed it matches the file extension to the content type that's defined in a seperate file. A lot like the AddType command in Apache's conf files.
I'm getting Ethereal right now I'll report back on my findings.
I got it to work!
I'm using that code for both binary and ascii files, yeah it's only 1 byte at a time but it works. There is one issue it's printing "ÿÿÿÿÿÿÿÿÿ" at the end of the file, I'll have to find the bug that's causing that, shouldn't be too hard.
Thanks your help, this networking stuff is pretty new to me still and there wasn't any examples of a simple web server to look at.
for (unsigned short x = 0; x < (unsigned short)results.st_size; x++){ bBuf = inputFile.get(); sendP(socket,bBuf);}
I'm using that code for both binary and ascii files, yeah it's only 1 byte at a time but it works. There is one issue it's printing "ÿÿÿÿÿÿÿÿÿ" at the end of the file, I'll have to find the bug that's causing that, shouldn't be too hard.
Thanks your help, this networking stuff is pretty new to me still and there wasn't any examples of a simple web server to look at.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement
Recommended Tutorials
Advertisement