Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Simple echo server with BIOs

44 views
Skip to first unread message

Brian Lavender

unread,
Jun 10, 2008, 2:53:21 PM6/10/08
to
I am trying to write a simple echo server. I first decided to try it
with the BIO without any keys. I keep having problems with blocking. It
seems that it gets stuck somewhere expecting a read or a write. You will
notice on the client that I do BIO_write. Then I do a BIO_read in a loop
to get the data. This comes across, but then when I try to do a
BIO_write the second time, it blocks and I get no return. What am
I doing wrong?

I have the OpenSSL book and it just has writes from the client and the
server just prints it out. Is there a simple example of an echo server
and client somewhere?

brian

=== simple_client.c ===

#include "openssl/ssl.h"
#include "openssl/bio.h"
#include "openssl/err.h"

#include "stdio.h"
#include "string.h"

int main()
{
BIO * bio;
int p;

char * request = "Some new things coming today\n";
char * request2 = "Tomorrow is a new day\n";
char r[1024];

/* Set up the library */

ERR_load_BIO_strings();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();

/* Create and setup the connection */

bio = BIO_new_connect("mary.internal.brie.com:4422");
if(bio == NULL) { printf("BIO is null\n"); return; }

if(BIO_do_connect(bio) <= 0)
{
ERR_print_errors_fp(stderr);
BIO_free_all(bio);
return;
}

/* Send the request */

BIO_write(bio, request, strlen(request));
for(;;)
{
p = BIO_read(bio, r, 1023);
if(p <= 0) break;
r[p] = 0;
printf("%s", r);
}

BIO_flush(bio);

if (BIO_should_read(bio))
printf("Bio needs to read\n");

BIO_write(bio, request2, strlen(request2));

/* Read in the response */

for(;;)
{
p = BIO_read(bio, r, 1023);
if(p <= 0) break;
r[p] = 0;
printf("%s", r);
}


/* Close the connection and free the context */

BIO_free_all(bio);
return 0;
}

=== simple_server.c ===

#include "stdio.h"
#include "string.h"

#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
#define BUFSIZE 1024


int main()
{
BIO *abio, *out ;
pthread_t tid;
char buf[80];
int err, nread;


printf("Secure Programming with the OpenSSL API, Part 4:\n");
printf("Serving it up in a secure manner\n\n");

SSL_library_init();

SSL_load_error_strings();
ERR_load_BIO_strings();
ERR_load_SSL_strings();
OpenSSL_add_all_algorithms();


printf("Attempting to create BIO object... ");


abio = BIO_new_accept("4422");

printf("Waiting for incoming connection...\n");

if(BIO_do_accept(abio) <= 0)
{
ERR_print_errors_fp(stdout);
BIO_free_all(abio);
return -1;
}

if (BIO_do_accept(abio) <= 0)
{
ERR_print_errors_fp(stderr);
BIO_free_all(abio);
return -1;
}
printf("Got a connection\n");

out = BIO_pop(abio);


do
{
for (nread = 0; nread < sizeof(buf); nread += err)
{
err = BIO_read(out, buf + nread, sizeof(buf) - nread);
printf("The number of bytes read %d\n",err);
if (BIO_should_retry(out) )
printf("Should retry read\n");
if (err <= 0)
break;

if ( err > 0 )
{
BIO_puts(out,"Hello from the server\n");
BIO_write(out,buf,err);
fprintf(stdout, "%s", buf);
}
}
}
while (err > 0);

if (err < 0)
printf("Error on read\n");

// replacement ends here

BIO_free_all(abio);

}

--
Brian Lavender
http://www.brie.com/brian/
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List openss...@openssl.org
Automated List Manager majo...@openssl.org

0 new messages