# HG changeset patch # User František Kučera # Date 1479506822 -3600 # Node ID 9c0f52aa4772159072b7fa6d189a66055bc7ce90 # Parent 1fec66105b8eea64e34ba13c0a484beeafa3358e libevent: unixové sokety místo TCP diff -r 1fec66105b8e -r 9c0f52aa4772 c++/domain-socket-bridge/domain-socket-bridge.c --- a/c++/domain-socket-bridge/domain-socket-bridge.c Fri Nov 18 21:41:23 2016 +0100 +++ b/c++/domain-socket-bridge/domain-socket-bridge.c Fri Nov 18 23:07:02 2016 +0100 @@ -8,10 +8,12 @@ #include #include #include +#include +#include static const char MESSAGE[] = "Hello, World!\n"; -static const int PORT = 9995; +static const char PATH[] = "./roura"; static void listener_cb(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *); @@ -24,7 +26,7 @@ struct evconnlistener *listener; struct event *signal_event; - struct sockaddr_in sin; + struct sockaddr_un sun; base = event_base_new(); if (!base) { @@ -32,17 +34,17 @@ return 1; } - memset(&sin, 0, sizeof (sin)); - sin.sin_family = AF_INET; - sin.sin_port = htons(PORT); + memset(&sun, 0, sizeof (sun)); + sun.sun_family = AF_UNIX; + strcpy(sun.sun_path, PATH); listener = evconnlistener_new_bind(base, listener_cb, (void *) base, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -1, - (struct sockaddr*) &sin, - sizeof (sin)); + (struct sockaddr*) &sun, + sizeof (sun)); if (!listener) { - fprintf(stderr, "Could not create a listener!\n"); + fprintf(stderr, "Could not create domain socket: %s!\n", PATH); return 1; } @@ -58,6 +60,9 @@ evconnlistener_free(listener); event_free(signal_event); event_base_free(base); + + // smažeme soket na disku / soubor -- jinak by program příště spadl na evconnlistener_new_bind() + unlink(PATH); printf("done\n"); return 0; @@ -96,9 +101,9 @@ printf("Connection closed.\n"); } else if (events & BEV_EVENT_ERROR) { printf("Got an error on the connection: %s\n", - strerror(errno)); /*XXX win32*/ + strerror(errno)); } - + // None of the other events can happen here, since we haven't enabled timeouts bufferevent_free(bev); }