Skip to content

Instantly share code, notes, and snippets.

@lhuard1A
Created November 19, 2015 16:27
Show Gist options
  • Save lhuard1A/cfd007b42db0b372bf83 to your computer and use it in GitHub Desktop.
Save lhuard1A/cfd007b42db0b372bf83 to your computer and use it in GitHub Desktop.
TCP keepalive test
# /*
this_md5="$(md5sum < "$0" | cut -d' ' -f1)"
last_md5="$(readelf -p SOURCE_FILE_HASH "${0%.c}" 2>/dev/null | awk '/\[ *0\]/ { print $3 }')"
if [ "$this_md5" != "$last_md5" ]; then
gcc -pipe -Wall -Wextra -std=gnu11 -g -march=native -O3 -DTHIS_MD5="\"$this_md5\"" -o "${0%.c}" "$0" ||
exit 1
fi
exec "${0%.c}" "$@"
exit 1
# */
#ifndef THIS_MD5
# define THIS_MD5 "not set"
#endif
char MD5[] __attribute__((section ("SOURCE_FILE_HASH"))) = THIS_MD5;
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
int main()
{
int s = socket(AF_INET, SOCK_STREAM, 0 );
if( s < 0 ) {
perror( "socket" );
return EXIT_FAILURE;
}
int opt = 1;
if( setsockopt( s, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt) ) < 0 ) {
perror( "setsockopt( SO_KEEPALIVE )" );
return EXIT_FAILURE;
}
opt = 1;
if( setsockopt( s, SOL_TCP, TCP_KEEPIDLE, &opt, sizeof(opt) ) < 0 ) {
perror( "setsockopt( TCP_KEEPIDLE )" );
return EXIT_FAILURE;
}
opt = 1;
if( setsockopt( s, SOL_TCP, TCP_KEEPINTVL, &opt, sizeof(opt) ) < 0 ) {
perror( "setsockopt( TCP_KEEPINTVL )" );
return EXIT_FAILURE;
}
opt = 10;
if( setsockopt( s, SOL_TCP, TCP_KEEPCNT, &opt, sizeof(opt) ) < 0 ) {
perror( "setsockopt( TCP_KEEPCNT )" );
return EXIT_FAILURE;
}
struct sockaddr_in addr;
memset( &addr, 0, sizeof(addr) );
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(8080);
if( bind( s, (struct sockaddr *)&addr, sizeof(addr) ) < 0 ) {
perror( "bind" );
return EXIT_FAILURE;
}
if( listen( s, 1 ) < 0 ) {
perror( "listen" );
return EXIT_FAILURE;
}
int c = accept( s, NULL, NULL );
if( c < 0 ) {
perror( "accept" );
return EXIT_FAILURE;
}
FILE *f = fdopen( c, "r" );
if( f == NULL ) {
perror( "fdopen" );
return EXIT_FAILURE;
}
char *line = NULL;
size_t line_sz = 0;
while( getline( &line, &line_sz, f ) != -1 )
fputs( line, stdout );
free( line );
if( close(c) < 0 ) {
perror( "close" );
return EXIT_FAILURE;
}
if( close(s) < 0 ) {
perror( "close" );
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment