W3C home > Mailing lists > Public > www-lib@w3.org > January to March 2001

Using HTEvent_*

From: Worik Macky Turei Stanton <worik@noggon.co.nz>
Date: 11 Mar 2001 17:29:13 +1300
To: www-lib@w3.org
Message-ID: <87vgphszc6.fsf@noggon.co.nz>

I am still trying to come to grips with this API.  I am trying to get
a multithreaded style thing happening in the full knowledge that I
cannot expect the library to be thread safe.  So I am looking at using
an event loop.

What I want to do is open a socket then be able to deal with clients
connecting simultaneously(ish).  I want lowlevel access to the bytes
that are comming in on the socket, but I cannot work out when to read

My plan is to listen on a socket, register it with HTEvent_ACCEPT or
CONNECT (??) and handle connections there.

I start my programme then connect to it with telnet and monitor what
it does in a debugger or with progress statements.

I am getting nowhere much mostly because I do not know how I should
handle the events, what I should do with them etc.

I do not know as much about socket functions as I should and I am
(still!) a complete beginner with libwww.

There are no examples that do this sort of stuff in the
Library/Examples.  Is there any where I can find some examples?  Can
someone tell me what I am doing right and wrong with this code?


#include <string>
using namespace std;

#include "proxy.h"
#include "WWWLib.h"
#include "WWWHTTP.h"
#include "WWWInit.h"
#define MAX_COUNT	1024

/* ----------------------------------------------------------------- */

printer (const char * fmt, va_list pArgs) {
    return (vfprintf(stdout, fmt, pArgs));
tracer (const char * fmt, va_list pArgs) {
    return (vfprintf(stderr, fmt, pArgs));
terminateHandler (HTRequest * request, HTResponse * response,
		   void * param, int status) {

    HTChunk * chunk = (HTChunk *) HTRequest_context(request);

    if (status == HT_LOADED && chunk && HTChunk_data(chunk))
	HTPrint("%s", HTChunk_data(chunk));

    /* Remember to delete our chunk of data */
    if (chunk) HTChunk_delete(chunk);
    /* We are done with this request */
    return HT_OK;
int Connect (SOCKET s, void * vp, HTEventType e){
    cout << "Connect "<<s<<"\n";
    return 0;
int Read (SOCKET s, void * vp, HTEventType e){
    cout << "Read "<<s<<"\n";
    return 0;
int Accept (SOCKET s, void * vp, HTEventType e){
    cout << "Accept from "<<s<<" to ";
    struct sockaddr *cliaddr;
    socklen_t clilen;
    cliaddr = new struct sockaddr;
    SOCKET connfd = accept (s, cliaddr, &clilen);
    cout << connfd <<endl;
    HTEvent_register(connfd, HTEvent_READ, 
		     HTEvent_new (Read, 0, _HTPriority(0), 10000));
    HTEvent_register(connfd, HTEvent_CONNECT, 
		     HTEvent_new (Connect, 0, _HTPriority(0), 10000));
    HTEvent_register(connfd, HTEvent_ACCEPT, 
		     HTEvent_new (Accept, 0, _HTPriority(0), 10000));
    return 0;
InitW3C() {

    /* Create a new premptive client */
    HTProfile_newNoCacheClient("libwww-MGET", "1.0");

    /* Need our own trace and print functions */

    /* Add our own filter to handle termination */
    HTNet_addAfter(terminateHandler, NULL, NULL, HT_ALL, HT_FILTER_LAST);

    /* Set up default event loop */

    /* Turn on tracing */
#if 0
    /* We don't wany any progress notification or other user stuff */


main (int argc, char ** argv)


    socklen_t addrlen;
    const char * src_port = "8088";
    int sdIn = tcp_listen (NULL, src_port, &addrlen);

    HTEvent_register(sdIn, HTEvent_CONNECT, 
		     HTEvent_new (Connect, 0, _HTPriority(0), 10000));
    HTEvent_register(sdIn, HTEvent_ACCEPT, 
		     HTEvent_new (Accept, 0, _HTPriority(0), 10000));

    HTEventList_newLoop ();	
	cout << '.';

    return 0;

I connect with telnet 8088

The output I get is....

Accept from 4 to 5
Connect 5
Connect 5
Connect 5
Connect 5
Connect 5
Accept from 5 to -1
Connect 5
Accept from 5 to -1

I have at this point killed the telnet session.

                     Worik Macky Turei Stanton
    This line would not have seven words if only it had eight words less.
Received on Saturday, 10 March 2001 23:26:30 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:33:53 UTC