Skip to content

Instantly share code, notes, and snippets.

@vtols
Last active December 10, 2015 05:18
Show Gist options
  • Save vtols/4386899 to your computer and use it in GitHub Desktop.
Save vtols/4386899 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <string.h>
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#endif
#define NANO 1000000000LL
#define DMICRO 10000000LL
#ifdef _WIN32
typedef FILETIME Timer;
FILETIME start_timer()
{
SYSTEMTIME st;
FILETIME ft;
GetSystemTime(&st);
SystemTimeToFileTime(&st, &ft);
return ft;
}
double elapse_timer(FILETIME t0)
{
FILETIME t1;
unsigned long long l0, l1, diff;
double tdiff;
t1 = start_timer();
l0 = t0.dwHighDateTime * NANO + t0.dwLowDateTime;
l1 = t1.dwHighDateTime * NANO + t1.dwLowDateTime;
diff = l1 - l0;
tdiff = (double) (diff % DMICRO) / DMICRO + (double) diff / DMICRO;
return tdiff;
}
#else
typedef struct timespec Timer;
struct timespec
start_timer()
{
struct timespec t0;
clock_gettime(CLOCK_MONOTONIC, &t0);
return t0;
}
double
elapse_timer(t0)
struct timespec t0;
{
struct timespec t1, diff;
double tdiff;
clock_gettime(CLOCK_MONOTONIC, &t1);
diff.tv_nsec = t1.tv_nsec - t0.tv_nsec;
diff.tv_sec = t1.tv_sec - t0.tv_sec;
if (diff.tv_nsec < 0) {
diff.tv_nsec += NANO;
diff.tv_sec--;
}
tdiff = diff.tv_sec + (double) diff.tv_nsec / NANO;
return tdiff;
}
#endif
int create_tcp(int port)
{
int sock = 0;
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(port);
sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, (struct sockaddr *)&address, sizeof(address));
listen(sock, 10);
return sock;
}
void init()
{
#ifdef _WIN32
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif
}
int main(int argc, char *argv[])
{
int serv_sock, cl_sock;
struct sockaddr_in address;
Timer t;
char msg[200], ds[30];
double d;
int addrlen = sizeof(struct sockaddr_in);
init();
serv_sock = create_tcp(8080);
t = start_timer();
while (1) {
cl_sock = accept(serv_sock,
(struct sockaddr *)&address, &addrlen);
d = elapse_timer(t);
printf("%.3f\n", d);
sprintf(ds, "%.3f", d);
sprintf(msg,
"HTTP/1.0 200 OK\r\n"
"Server: TimeServer\r\n"
"Content-Type: text/plain\r\n"
"Content-Length: %d\r\n"
"Connection: close\r\n\r\n"
"%s\r\n",
strlen(ds), ds
);
send(cl_sock, msg, strlen(msg), 0);
//close(cl_sock);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment