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>
Friends

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
it.

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

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

int 
printer (const char * fmt, va_list pArgs) {
    return (vfprintf(stdout, fmt, pArgs));
}
int 
tracer (const char * fmt, va_list pArgs) {
    return (vfprintf(stderr, fmt, pArgs));
}
int
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 */
    HTRequest_delete(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;
}
void
InitW3C() {

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

    /* Need our own trace and print functions */
    HTPrint_setCallback(printer);
    HTTrace_setCallback(tracer);

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

    /* Set up default event loop */
    HTEventInit();

    /* Turn on tracing */
#if 0
    HTSetTraceMessageMask("*");
#endif
    
    /* We don't wany any progress notification or other user stuff */
    HTAlert_setInteractive(NO);

}

int 
main (int argc, char ** argv)
{

    InitW3C();

    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 ();	
    while(1){
	sleep(1);
	cout << '.';
    }

    return 0;
}


I connect with telnet 127.0.0.1 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
-- 
                     Worik Macky Turei Stanton
                          worik@noggon.co.nz
                              Aotearoa
    This line would not have seven words if only it had eight words less.
Received on Saturday, 10 March 2001 23:26:30 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 23 April 2007 18:18:38 GMT