Entry 32228

wehs.c

   

Submitted by pitulloz on Feb. 1, 2012 at 5:02 a.m.
Language: C. Code size: 3.1 KB.

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

char *resp = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n";
char *icon = "HTTP/1.1 200 OK\r\nContent-Type: image/icon\r\nConnection: close\r\n\r\n";
char *jpeg = "HTTP/1.1 200 OK\r\nContent-Type: image/jpeg\r\nConnection: close\r\n\r\n";

void exitn(char *m) {
	fprintf(stderr, "%s: %d\n", m, WSAGetLastError());
	exit(1);
}

void rswrite(int cs, char *s) {
	if (send(cs, resp, strlen(resp), 0) != (int)strlen(resp))
		exitn("send failed");
	if (send(cs, s, strlen(s), 0) != (int)strlen(s))
		exitn("send failed");
}

int loadf(const char *file, char **mem) {
	int size = 0;
	FILE *f = fopen(file, "rb");
	if (f == NULL) {
		*mem = NULL;
		return -1;
	}
	fseek(f, 0, SEEK_END);
	size = ftell(f);
	fseek(f, 0, SEEK_SET);
	*mem = (char *)malloc(size+1);
	if (size != fread(*mem, sizeof(char), size, f)) {
		free(*mem);
		return -2;
	}
	fclose(f);
	(*mem)[size] = 0;
	return size;
}

void rsicon(int cs, char *f) {
	char *fc;
	int fs;
	fs = loadf(f, &fc);
	if (fs >= 0) {
		if (send(cs, icon, strlen(icon), 0) != (int)strlen(icon))
			exitn("send failed");
		if (send(cs, fc, fs, 0) != fs)
			exitn("send failed");
		free(fc);
	}
}

void rsjpeg(int cs, char *f) {
	char *fc;
	int fs;
	fs = loadf(f, &fc);
	if (fs >= 0) {
		if (send(cs, jpeg, strlen(jpeg), 0) != (int)strlen(jpeg))
			exitn("send failed");
		if (send(cs, fc, fs, 0) != fs)
			exitn("send failed");
		free(fc);
	}
}

int main(int argc, char *argv[]) {
	WSADATA wsd;
	unsigned short port;
	int ssck, csck;
	struct sockaddr_in sadr, cadr;
	int clen;
	int rcvd;
	char buff[1024];
	char path[100];
	char *pos;
	char *s;
	int len;

	if (argc != 2) {
		fprintf(stderr, "usage: %s <server port>\n", argv[0]);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(1, 0), &wsd) != 0) {
		fprintf(stderr, "WSAStartup failed");
		exit(1);
	}

	port = atoi(argv[1]);
	if ((ssck = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
		exitn("socket failed");

	sadr.sin_family = AF_INET;
	sadr.sin_addr.s_addr = htonl(INADDR_ANY);
	sadr.sin_port = htons(port);
	if (bind(ssck, (struct sockaddr *)&sadr, sizeof(sadr)) < 0)
		exitn("bind failed");

	if (listen(ssck, 5) < 0)
		exitn("listen failed");

	for (;;) {
		clen = sizeof(cadr);
		if ((csck = accept(ssck, (struct sockaddr *)&cadr, &clen)) < 0)
			exitn("accept failed");

		printf("handling client %s ", inet_ntoa(cadr.sin_addr));

		if ((rcvd = recv(csck, buff, 1024, 0)) < 0)
			exitn("recv failed");
		buff[rcvd] = 0;

		s = (char *)&buff;
		pos = strstr(s, "GET /");
		if (pos != 0)
			s += (int)(pos-s)+5;
		pos = strchr(s, ' ');
		if (pos != 0) {
			len = (int)(pos-s);
			memcpy(path, s, len);
			path[len] = 0;
		}

		if (strcmp(path, "test/") == 0) {
			rswrite(csck, path);
		} else if (strcmp(path, "favicon.ico") == 0) {
			rsicon(csck, path);
		} else if (strcmp(path, "nigel.jpg") == 0) {
			rsjpeg(csck, path);
		} else {
			rswrite(csck, "not found");
		}

		printf("%s\n", path);
		closesocket(csck);
	}
	return 0;
}

This snippet took 0.03 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).