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;
}