37 #include <netinet/in.h> 38 #include <netinet/tcp.h> 39 #include <sys/socket.h> 40 #include <sys/types.h> 59 listeningDisabled =
false;
61 bindToLoopback =
false;
68 panic(
"Too late to disable all listeners, already have a listener");
69 listeningDisabled =
true;
75 return listeningDisabled;
82 panic(
"Too late to bind to loopback, already have a listener");
83 bindToLoopback =
true;
91 : listening(false),
fd(-1)
105 panic(
"Socket already listening!");
107 fd = ::socket(PF_INET, SOCK_STREAM, 0);
109 panic(
"Can't create socket:%s !", strerror(errno));
113 if (::setsockopt(
fd, SOL_SOCKET, SO_REUSEADDR, (
char *)&i,
115 panic(
"ListenSocket(listen): setsockopt() SO_REUSEADDR failed!");
118 struct sockaddr_in sockaddr;
119 sockaddr.sin_family = PF_INET;
120 sockaddr.sin_addr.s_addr =
122 sockaddr.sin_port = htons(port);
124 memset(&sockaddr.sin_zero, 0,
sizeof(sockaddr.sin_zero));
125 int ret = ::bind(
fd, (
struct sockaddr *)&sockaddr,
sizeof (sockaddr));
127 if (ret == -1 && errno != EADDRINUSE)
128 panic(
"ListenSocket(listen): bind() failed!");
133 if (errno != EADDRINUSE)
134 panic(
"ListenSocket(listen): listen() failed!");
150 struct sockaddr_in sockaddr;
151 socklen_t slen =
sizeof (sockaddr);
152 int sfd =
::accept(
fd, (
struct sockaddr *)&sockaddr, &slen);
153 if (sfd != -1 && nodelay) {
155 if (::setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, (
char *)&i,
157 warn(
"ListenSocket(accept): setsockopt() TCP_NODELAY failed!");
#define panic(...)
This implements a cprintf based panic() function.
virtual bool listen(int port, bool reuse=true)
Overload hash function for BasicBlockRange type.
static bool bindToLoopback
static bool allDisabled()
static void loopbackOnly()
virtual int accept(bool nodelay=false)
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,16,32,64}_t.
static bool listeningDisabled