From: Nikos Mavrogiannopoulos Date: Wed, 10 May 2000 06:56:36 +0000 (+0000) Subject: Improved client/server examples. X-Git-Tag: gnutls0-0-4~67 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=88fb7db5d745bca0bf6fec04f1915ce568aaacd2;p=thirdparty%2Fgnutls.git Improved client/server examples. --- diff --git a/lib/gnutls_int.h b/lib/gnutls_int.h index d134d624b8..7592a3d1d3 100644 --- a/lib/gnutls_int.h +++ b/lib/gnutls_int.h @@ -1,8 +1,8 @@ #include #include -#define HARD_DEBUG -#define DEBUG +#undef HARD_DEBUG +#undef DEBUG #define svoid void /* for functions that allocate using secure_free */ #define secure_free(x) if (x!=NULL) free(x) diff --git a/src/cli.c b/src/cli.c index 2d093fc23a..dc24884316 100644 --- a/src/cli.c +++ b/src/cli.c @@ -30,14 +30,15 @@ #define SA struct sockaddr #define ERR(err,s) if (err==-1) {perror(s);return(1);} +#define MAX_BUF 100 int main() { int err, ret; - int sd; + int sd, pid; struct sockaddr_in sa; GNUTLS_STATE state; - char buffer[100]; + char buffer[MAX_BUF]; // signal(SIGPIPE, SIG_IGN); @@ -60,42 +61,40 @@ int main() gnutls_perror(ret); return 1; } else { - fprintf(stderr, "Handshake was finished\n"); + fprintf(stderr, "Handshake was completed\n\n"); } - bzero(buffer, sizeof(buffer)); - ret = gnutls_recv(sd, state, buffer, 5); - if (gnutls_is_fatal_error(ret) == 1) { - if (ret == GNUTLS_E_CLOSURE_ALERT_RECEIVED) { - fprintf(stderr, - "Peer has closed the GNUTLS connection\n"); - return 0; - } else { - fprintf(stderr, "Received corrupted data(%d)\n", - ret); - return 1; + if ( pid = fork() == 0) { + for(;;) { + bzero(buffer, MAX_BUF); + ret=gnutls_recv(sd, state, buffer, MAX_BUF); + if (gnutls_is_fatal_error(ret) == 1) { + if (ret == GNUTLS_E_CLOSURE_ALERT_RECEIVED) { + fprintf(stderr, + "Peer has closed the GNUTLS connection\n"); + break; + } else { + fprintf(stderr, "Received corrupted data(%d)\n", + ret); + break; + } + } else { + fprintf(stdout, "Received: %s\n", buffer); + } } - } else { - fprintf(stdout, "Received: %s\n", buffer); + kill(getppid(), SIGTERM); + return 0; } - - ret = gnutls_recv(sd, state, buffer, 10); - if (gnutls_is_fatal_error(ret) == 1) { - if (ret == GNUTLS_E_CLOSURE_ALERT_RECEIVED) { - fprintf(stderr, - "Peer has closed the GNUTLS connection\n"); - return 0; - } else { - fprintf(stderr, "Received corrupted data(%d)\n", - ret); - return 1; - } - } else { - fprintf(stdout, "Received: %s\n", buffer); + /* parent */ + + while( fgets(buffer, MAX_BUF, stdin) != NULL) { + buffer[strlen(buffer)-1] = '\0'; + gnutls_send( sd, state, buffer, strlen(buffer)); } gnutls_close(sd, state); - close(sd); + shutdown( sd, SHUT_WR); + gnutls_deinit(&state); return 0; } diff --git a/src/port.h b/src/port.h index 1c34f44c6a..38977de9d6 100644 --- a/src/port.h +++ b/src/port.h @@ -1 +1 @@ -#define PORT 6666 +#define PORT 6667 diff --git a/src/serv.c b/src/serv.c index e48b6f8233..04aef65dc6 100644 --- a/src/serv.c +++ b/src/serv.c @@ -29,71 +29,88 @@ #define SA struct sockaddr #define ERR(err,s) if(err==-1) {perror(s);return(1);} +#define MAX_BUF 100 int main() { - int err, listen_sd; - int sd, ret; - struct sockaddr_in sa_serv; - struct sockaddr_in sa_cli; - int client_len, i; - char topbuf[512]; - GNUTLS_STATE state; - char *str; - char buf[4096]; + int err, listen_sd; + int sd, ret; + struct sockaddr_in sa_serv; + struct sockaddr_in sa_cli; + int client_len, i; + char topbuf[512]; + GNUTLS_STATE state; + char *str; + char buf[4096]; + char buffer[MAX_BUF]; - listen_sd = socket(AF_INET, SOCK_STREAM, 0); - ERR(listen_sd, "socket"); + listen_sd = socket(AF_INET, SOCK_STREAM, 0); + ERR(listen_sd, "socket"); - memset(&sa_serv, '\0', sizeof(sa_serv)); - sa_serv.sin_family = AF_INET; - sa_serv.sin_addr.s_addr = INADDR_ANY; - sa_serv.sin_port = htons(PORT); /* Server Port number */ + memset(&sa_serv, '\0', sizeof(sa_serv)); + sa_serv.sin_family = AF_INET; + sa_serv.sin_addr.s_addr = INADDR_ANY; + sa_serv.sin_port = htons(PORT); /* Server Port number */ - err = bind(listen_sd, (SA *) & sa_serv, sizeof(sa_serv)); - ERR(err, "bind"); - err = listen(listen_sd, 1024); - ERR(err, "listen"); + err = bind(listen_sd, (SA *) & sa_serv, sizeof(sa_serv)); + ERR(err, "bind"); + err = listen(listen_sd, 1024); + ERR(err, "listen"); - client_len = sizeof(sa_cli); - for (;;) { - gnutls_init(&state, GNUTLS_SERVER); - sd = accept(listen_sd, (SA *) & sa_cli, &client_len); + client_len = sizeof(sa_cli); + for (;;) { + gnutls_init(&state, GNUTLS_SERVER); + sd = accept(listen_sd, (SA *) & sa_cli, &client_len); - fprintf(stderr, "connection from %s, port %d\n", - inet_ntop(AF_INET, &sa_cli.sin_addr, topbuf, - sizeof(topbuf)), ntohs(sa_cli.sin_port)); + fprintf(stderr, "connection from %s, port %d\n", + inet_ntop(AF_INET, &sa_cli.sin_addr, topbuf, + sizeof(topbuf)), ntohs(sa_cli.sin_port)); - ret = gnutls_handshake(sd, state); - if (ret < 0) { - close(sd); - gnutls_deinit(&state); - fprintf(stderr, "Handshake has failed\n", ret); - gnutls_perror(ret); - continue; + ret = gnutls_handshake(sd, state); + if (ret < 0) { + close(sd); + gnutls_deinit(&state); + fprintf(stderr, "Handshake has failed\n", ret); + gnutls_perror(ret); + continue; + } + fprintf(stderr, "Handshake was completed\n"); + fprintf(stderr, "Acting as echo server..."); + ret = + gnutls_send(sd, state, "hello client", + sizeof("hello client")); + if (ret < 0) { + close(sd); + gnutls_deinit(&state); + gnutls_perror(ret); + continue; + } + for (;;) { + bzero( buffer, MAX_BUF); + ret = gnutls_recv(sd, state, buffer, MAX_BUF); + if (gnutls_is_fatal_error(ret) == 1) { + if (ret == GNUTLS_E_CLOSURE_ALERT_RECEIVED) { + fprintf(stderr, + "\nPeer has closed the GNUTLS connection\n"); + break; + } else { + fprintf(stderr, "\nReceived corrupted data\n"); + break; } - fprintf(stderr, "Handshake was completed\n"); - ret = - gnutls_send(sd, state, "hello world\n", - sizeof("hello world\n")); - if (ret < 0) { - close(sd); - gnutls_deinit(&state); - gnutls_perror(ret); - continue; - } - fprintf(stderr, "Data was send (%d)\n", ret); - fprintf(stderr, "\n"); - gnutls_close(sd, state); - close(sd); - gnutls_deinit(&state); + } + gnutls_send(sd, state, buffer, strlen(buffer)); } - close(listen_sd); - return 0; + fprintf(stderr, "\n"); + gnutls_close(sd, state); + close(sd); + gnutls_deinit(&state); + } + close(listen_sd); + return 0; }