Tuesday, November 3, 2009

Listen for http connections with C


#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <arpa/inet.h>
#include <time.h>

#define PORT 30000
#define MAXBUFF 1024

int wwwsock;

void myError(char *err) {
perror(err);
exit(1);
}

void catchSig(int sig) {
close(wwwsock);
exit(0);
}

int main(int argc, char *argv[]) {
char timebuff[250];

char *buffer;
char *req;
int clientAddr, newConnection, size;
int optval=1;

time_t curtime;
struct sockaddr_in serv_addr, cli_addr;

(void)signal(SIGINT, catchSig);
wwwsock = socket(AF_INET, SOCK_STREAM, 0);


if(wwwsock<0)
myError("Socket Failed\n");


memset(&serv_addr,'\0',sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);

setsockopt(wwwsock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);

if (bind(wwwsock,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {

char error[30];
sprintf(error,"ERROR binding to port %d",PORT);
myError(error);
}


listen(wwwsock,5);
clientAddr=sizeof(struct sockaddr_in);
buffer=malloc(MAXBUFF);

req=malloc(MAXBUFF);
while(1) {
newConnection=accept(wwwsock,(struct sockaddr *) &cli_addr,(socklen_t *)&clientAddr);

memset(buffer,'\0',sizeof(buffer));

if(recv(newConnection,buffer,MAXBUFF,0) > 0) {


if(strstr(buffer,"\n")) {
size=(strlen(buffer)-strlen(strstr(buffer,"\n")));

}
else
size=0;

if(size>0 && size<MAXBUFF) {

curtime=time(NULL);
strftime(timebuff,sizeof(timebuff),"%c",localtime (&curtime));
strncpy(req,buffer,size+1);
printf("%s Client %s Requested %s",timebuff,inet_ntoa(cli_addr.sin_addr),req);

}

send(newConnection,"HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\n",22,0);

close(newConnection);
}
}
close(wwwsock);
return 0;

}

No comments: