Sign in to follow this  

Coding a http simple server.

This topic is 3864 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Im gonna try to code a simple http server for the experience. Anyone know any usefull doc's on such a process besides the http proto spec's? I was thinking something in tutorial form, code sample, or just general guidelines. And by code samples i dont mean reviewing the massive apache source =P Preferebly in C++ or C# Thanks.

Share this post


Link to post
Share on other sites
Look here
http://www.w3.org/Protocols/rfc2616/rfc2616.html

Click on 14 Header Field Definitions for the meaning of the different header fields.
The easiest thing for this I think is to create a simple application that listens on port 80 and on connection it prints all incoming data to the screen. This way you connect with your browser to your own program and you will see the headers, so you see what you need to parse.
Then you write code to parse the header and send a reply.

You can also write a program that connects to some web-server on the net and sends the same headers as you got to your program, when connecting to it with your browser. Then let this program print the response, and you see how servers respond.

Share this post


Link to post
Share on other sites
Here's a small example to get you started if you need it. Should work to just run it and then type http://localhost/ in your web-browser.


#include <stdio.h>
#include <winsock.h>

int main() {
WSADATA wsaData;
int iRet;
SOCKET listenSocket;
SOCKADDR_IN addr;

// Start winsock
iRet = WSAStartup(0x202, &wsaData);
if(iRet != 0 || wsaData.wVersion != 0x202) {
}

// Create socket to listen
listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(listenSocket == INVALID_SOCKET) {
}

// Bind to port
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(80);

iRet = bind(listenSocket, (LPSOCKADDR)&addr, sizeof(addr));
if(iRet == SOCKET_ERROR) {
}

// Listen
iRet = listen(listenSocket, SOMAXCONN);
if(iRet == SOCKET_ERROR) {
}

// Loop and accept connections
while(true) {
SOCKET connSocket;
SOCKADDR_IN connAddr;
int connAddrLen;

connAddrLen = sizeof(connAddr);

// Accept connection
connSocket = accept(listenSocket, (LPSOCKADDR)&connAddr, &connAddrLen);
if(connSocket == INVALID_SOCKET) {
}
else {
char data[100];

// Print the address the connection is from
if(connAddrLen == sizeof(connAddr)) {
printf("Connection: %s : %d\n", inet_ntoa(connAddr.sin_addr), ntohs(connAddr.sin_port));
}

// Receive data
iRet = recv(connSocket, data, 100, 0);
if(iRet == 0) {
// connection closed
}
else if(iRet == SOCKET_ERROR) {
}
else {
char response[200];
char contents[100];

// Here you should really parse the received data, and receive
// more than 100 bytes, all the way until the client sends
// two \r\n in a row which means the header has ended
// then parse the header and respond accordingly

// Just assume that it's a GET header for now and respond with HTML

// Response body, that is the document you send back
sprintf(contents, "<html><body><h1>HTML Response</h1></body></html>");

// The response with header + contents
sprintf(
response,
"HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n%s",
strlen(contents),
contents
);

// Send the data
iRet = send(connSocket, response, strlen(response), 0);
if(iRet == SOCKET_ERROR) {
}
}

// Close connection
iRet = closesocket(connSocket);
}
}

// Close listen socket
iRet = closesocket(listenSocket);

// Shutdown winsock
iRet = WSACleanup();

return 0;
}

Share this post


Link to post
Share on other sites

This topic is 3864 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this