Last active
August 29, 2015 14:18
-
-
Save kgersen/4948d08defffd1971f1b to your computer and use it in GitHub Desktop.
timed duration http server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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