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