Skip to content

Instantly share code, notes, and snippets.

@kgersen
Last active August 29, 2015 14:18
Show Gist options
  • Save kgersen/4948d08defffd1971f1b to your computer and use it in GitHub Desktop.
Save kgersen/4948d08defffd1971f1b to your computer and use it in GitHub Desktop.
timed duration http server
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <arpa/inet.h>
#include <stdio.h>
#define PORT 8192
#define TIMEOUT 10
int client;
void envoyerReponse();
void fermerConnexion();
int main()
{
signal(SIGCHLD, SIG_IGN);
// Informations sur le serveur
struct sockaddr_in6 serverInfo;
memset(&serverInfo, 0, sizeof serverInfo);
serverInfo.sin6_family = AF_INET6;
serverInfo.sin6_addr = in6addr_any;
serverInfo.sin6_port = htons(PORT);
// Creation du socket
int server = socket(AF_INET6, SOCK_STREAM, 0);
int yes = 1;
setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
bind(server, (struct sockaddr *) &serverInfo, sizeof serverInfo);
listen(server, 20);
for(;;)
{
struct sockaddr_in6 clientInfo;
int clientInfoSize = sizeof clientInfo;
client = accept(server, (struct sockaddr *) &clientInfo, &clientInfoSize);
if (fork() == 0)
{
envoyerReponse(client);
}
}
return 0;
}
void envoyerReponse()
{
// Arreter le programme apres TIMEOUT secondes
signal(SIGALRM, fermerConnexion);
alarm(TIMEOUT);
// Envoyer les headers HTTP
char headers[] =
"HTTP/1.1 200 OK\r\n"
"Content-Type: octet-stream\r\n"
"Cache-Control: no-cache, no-transform\r\n"
"\r\n";
write(client, headers, strlen(headers));
// Envoyer du contenu aleatoire en boucle
#define BUFFSIZE (4096)
char buffer[BUFFSIZE];
memset(&buffer, 0, sizeof buffer);
srand(time(NULL));
// Get buffer size
int sendbuff;
socklen_t optlen = sizeof(sendbuff);
int res = getsockopt(client, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);
if(res == -1)
printf("Error getsockopt one");
else
printf("send buffer size = %d\n", sendbuff);
for(;;)
{
// int i;
// for(i = 0; i < BUFFSIZE; i++)
// {
// buffer[i] = rand() & 255;
// }
if(write(client, buffer, sizeof buffer) < 0)
{
fermerConnexion();
}
}
}
void fermerConnexion()
{
// Les 10 secondes sont passé
shutdown(client, 2);
//close(client);
exit(0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment