#include #include #include #include #include #include #include #include #include void sighandler(int sig) { /* nothing :) */ } int setup_alarm_handler(int flags) { struct sigaction sa = { .sa_handler = &sighandler, .sa_flags = flags }; return sigaction(SIGALRM, &sa, NULL); } int setup_server(int port) { int sock; struct sockaddr_in sa = { .sin_family = AF_INET, .sin_port = htons(port), .sin_addr.s_addr = htonl(INADDR_ANY) }; if ((sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) goto error; if (bind(sock, (struct sockaddr*)&sa, sizeof(sa)) < 0) goto error_clean; if (listen(sock, 16) < 0) goto error_clean; return sock; error_clean: close(sock); error: return -1; } int setup_client(const char *server, int port) { int sock; struct sockaddr_in sa = { .sin_family = AF_INET, .sin_port = htons(port), .sin_addr.s_addr = inet_addr(server) }; if ((sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) goto error; if (connect(sock, (struct sockaddr*)&sa, sizeof(sa)) < 0) { printf("connect(): errno = %d\n", errno); goto error_clean; } return sock; error_clean: close(sock); error: return -1; } int main(int argc, char *argv[]) { int server, client; int flags = SA_RESTART; if (argc > 1) flags = 0; if (setup_alarm_handler(flags)) return 1; server = setup_server(3500); if (server < 0) { printf("Cannot setup server!\n"); return 1; } alarm(1); client = setup_client("127.0.0.1", 3500); if (client < 0) { printf("Cannot setup client!\n"); return 1; } printf("Ok!\n"); return 0; }