tcplib http echo server example

Web browser から接続を受け、送られてきた header 情報をそのまま text で返す server program。表示する header 情報は最大 8191 bytes まで。それ以上は棄てられる。


/* exam03.c 
 * Simple Http Mirror server
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tcplib.h"

#define MY_BUF_SIZE 8191
char mybuf[(MY_BUF_SIZE + 1)];
const char head[] =
	"HTTP/1.0 200 OK\r\n"
	"Content-Type: text/plain\r\n"
	"\r\n";

int net_getchar(SOCKET s)
{
	char b[2];
	if(recv(s, b, 1, 0) != 1)
		return EOF;
	return ((int)b[0]) & 255;
}

int doservice(SOCKET t)
{
	int rcvchars;
	int c;
	int lfcount;

	/* Fill received characters until <CR><LF><CR><LF> found */

	rcvchars = 0;
	mybuf[0] = 0;
	lfcount = 0;
	while((c = net_getchar(t)) != EOF)
	{
		if(rcvchars < (MY_BUF_SIZE - 1))
			mybuf[rcvchars++] = (char)c;

		if(c == '\n')
			++lfcount;
		else if(c != '\r')
			lfcount = 0;

		if(lfcount >= 2)
			break;
	}
	mybuf[rcvchars] = 0;
	tcpwrite(t, head, strlen(head));
	return tcpwrite(t, mybuf, rcvchars);
}

int main(int argc, char* argv[])
{
	static char crlf[] = {0x0a, 0x0d};
	SOCKET ss;
	SOCKET sa;
	int port;

	if(argc != 2)
	{
		fprintf(stderr, "Usage: %s port\n", argv[0]);
		return (-1);
	}
	port = atoi(argv[1]);

	netlibstart();
	ss = tcpsocket();
	tcplisten(ss, port, 5);
	while(1)
	{
		if((sa = accept(ss, 0, 0)) != INVALID_SOCKET)
		{
			doservice(sa);
			tcpclose(sa);
		}
	}
	netlibstop();
	return 0;
}