Does this sample code work for you?
http://lxr.mozilla.org/mozilla/source/netwerk/test/TestServ.cpp

-Darin



On 2/26/06, Jon Smirl <[EMAIL PROTECTED]> wrote:
> I can't figure out how to get a simple async listen loop going. I can
> put a breakpoint in the socket code and see the accept happen and a
> message for it gets queued. By this message does not end up calling my
> OnSocketAccepted() function.
>
> I see that there are two threads running, the main one and one
> automatically created when I made the ServerSocket. The Accept event
> is occurring on the second thread. I'm running the event pump on the
> main thread. Do I also need to pump this secondary thread?
>
> Is this secondary thread necessary? My app has no UI so it doesn't
> need a UI thread.
>
> --
> Jon Smirl
> [EMAIL PROTECTED]
>
>
> int
> main(void)
> {
>     nsresult rv;
>     Server server;
>
>     XPCOMGlueStartup(nsnull);
>
>     // Initialize XPCOM
>     nsCOMPtr<nsIServiceManager> servMan;
>     rv = NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull);
>     if (NS_FAILED(rv))
>     {
>         printf("ERROR: XPCOM intialization error [%x].\n", rv);
>         return -1;
>     }
>     // register all components in our default component directory
>     nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan);
>     NS_ASSERTION(registrar, "Null nsIComponentRegistrar");
>     registrar->AutoRegister(nsnull);
>
>     manager = do_QueryInterface(registrar);
>     NS_ASSERTION(registrar, "Null nsIComponentManager");
>
>     nsCOMPtr<nsIEventQueueService> eqs;
>     rv = manager->CreateInstanceByContractID(NS_EVENTQUEUESERVICE_CONTRACTID,
>                                              nsnull,
>                                              NS_GET_IID(nsIEventQueueService),
>                                              getter_AddRefs(eqs));
>
>     nsCOMPtr<nsIEventQueue> eq;
>     eqs->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs(eq));
>
>     server.init();
>
>     eq->EventLoop();
>
>     // process any remaining events before exiting
>     eq->ProcessPendingEvents();
>     eq->StopAcceptingEvents();
>     eq->ProcessPendingEvents();
>
>     // All nsCOMPtr's must be deleted prior to calling shutdown XPCOM
>     // as we should not hold references passed XPCOM Shutdown.
>     eq = 0;
>     eqs = 0;
>     servMan = 0;
>     registrar = 0;
>     manager = 0;
>
>     // Shutdown XPCOM
>     NS_ShutdownXPCOM(nsnull);
>
>     XPCOMGlueShutdown();
>     return 0;
> }
>
>
> // async_listener waits for a connection and
> // responds to input from the network.
> // The order of action is listen, accept connection, wait
> // for 'GET', deliver payload, quit
> class AsyncListener : public nsIServerSocketListener {
> public:
>   NS_DECL_ISUPPORTS
>   NS_DECL_NSISERVERSOCKETLISTENER
> };
> NS_IMPL_ISUPPORTS1(AsyncListener, nsIServerSocketListener)
>
>          // called after connection established
> nsresult AsyncListener::OnSocketAccepted(nsIServerSocket *aServ,
> nsISocketTransport *aTransport) {
>   nsresult rv;
>   nsCOMPtr<nsIInputStream> instream;
>   nsCOMPtr<nsIOutputStream> outstream;
>   StreamListener* stream_listener = new StreamListener();
>
>   aTransport->OpenInputStream(0, 0, 0, getter_AddRefs(instream));
>   aTransport->OpenOutputStream(0, 0, 0, getter_AddRefs(outstream));
>   stream_listener->init(instream, outstream);
>
>    // pump takes in data in chunks asynchronously
>   nsCOMPtr<nsIInputStreamPump> pump;
>   rv = manager->CreateInstanceByContractID(NS_INPUTSTREAMPUMP_CONTRACTID,
>                                            nsnull,
>                                            NS_GET_IID(nsIInputStreamPump),
>                                            getter_AddRefs(pump));
>   if (NS_FAILED(rv)) return rv;
>
>   pump->Init(instream, -1, -1, 0, 0, false);
>   pump->AsyncRead(NS_STATIC_CAST(nsIStreamListener*, stream_listener), NULL);
>   return rv;
> }
>
> nsresult Server::init(void) {
>   nsresult rv;
>
>   rv = manager->CreateInstanceByContractID(NS_SERVERSOCKET_CONTRACTID,
>                                            nsnull,
>                                            NS_GET_IID(nsIServerSocket),
>                                            getter_AddRefs(server));
>
>   rv = server->Init(8869,  true, -1);
>   rv = server->AsyncListen(new AsyncListener());
>   return rv;
> }
> _______________________________________________
> dev-tech-network mailing list
> [email protected]
> https://lists.mozilla.org/listinfo/dev-tech-network
>
_______________________________________________
dev-tech-network mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-network

Reply via email to