Компактный веб сервер для тестирования

Иногда для тестирования нужен легковесный веб сервер, функционал httpd или даже lighthttpd будет избыточен. Для таких целей подойдет самодельный веб сервер: сразу после отправки ответа на запрос происходит выход.

Данная версия помогла мне в случае, когда надо было имитировать обрыв ответа. Сервер посылает длину ответа 2000 в заголовке, но ответ заметно короче. Скомпилированный бинарник использовался под линуксом.

При желании функционал можно безу труда нарастить: передача в заголовке значения их командной строки, чтение из файла и пр.

#include <iostream>
#include <cstdlib>
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <strings.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
 
#define BUF_SIZE 2048
 
#define response_code "HTTP/1.0 200 OK\r\n"
 
#define SERVER "Server: Dynamic Thread\r\n"
#define CONTENT_TYPE "Content-Type: text/html\r\n"
#define CONTENT_LENGTH "Content-Length: 2000\r\n"
 
int main(int argc, char ** argv)
{
     int sock, newsock, port, clen;
     char buf[BUF_SIZE];
     struct sockaddr_in serv_addr, cli_addr;
     if (argc < 2) 
     {
         fprintf(stderr,"usage: %s <port_number>\n", argv[0]);
         return EXIT_FAILURE;
     }
     sock = socket(AF_INET, SOCK_STREAM, 0);
     if (socket < 0)
     {
       printf("socket() failed: %d\n", errno);
       return EXIT_FAILURE;
     }
     memset((char *) &serv_addr, 0, sizeof(serv_addr));
     port = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(port);
     if (bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
     {
       printf("bind() failed: %d\n", errno);
       return EXIT_FAILURE;
     }
     listen(sock, 1);
     clen = sizeof(cli_addr);
     newsock = accept(sock, (struct sockaddr *) &cli_addr, (socklen_t*) &clen);
     if (newsock < 0) 
     {
       printf("accept() failed: %d\n", errno);
       return EXIT_FAILURE;
     }
     memset(buf, 0, BUF_SIZE);
     read(newsock, buf, BUF_SIZE-1);
     buf[BUF_SIZE] = 0;
     printf("MSG: %s\n", buf);
 
     //Send HTTP Response line by line
     char buffer[BUF_SIZE];
     strcpy(buffer, response_code);
     write(newsock, buffer, strlen(buffer));
 
     strcpy(buffer, SERVER);
     write(newsock, buffer, strlen(buffer));
     strcpy(buffer, CONTENT_TYPE);
     write(newsock, buffer, strlen(buffer));
 
     strcpy(buffer, CONTENT_LENGTH);
     write(newsock, buffer, strlen(buffer));
 
     strcpy(buffer, "Last-Modified: Tue, 17 Apr 2012 14:32:04 GMT\r\n");
     write(newsock, buffer, strlen(buffer));
 
     strcpy(buffer, "Keep-Alive: timeout=15, max=50\r\n");
     write(newsock, buffer, strlen(buffer));
 
     strcpy(buffer, "Connection: Keep-Alive\r\n");
     write(newsock, buffer, strlen(buffer));
 
     strcpy(buffer, "\r\n");
     write(newsock, buffer, strlen(buffer));
 
     strcpy(buffer, "<html><body><h1>Connection was terminated - socket was closed</h1></body></html>");
     write(newsock, buffer, strlen(buffer));
 
     close(newsock);
     close(sock);
}

[sc:social_networks ]

You can leave a response, or trackback from your own site.

Leave a Reply