-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathclient_listen.c
More file actions
55 lines (45 loc) · 1.28 KB
/
client_listen.c
File metadata and controls
55 lines (45 loc) · 1.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
* Part of `snmp-query-engine`.
*
* Copyright 2012-2013, Anton Berezin <tobez@tobez.org>
* Modified BSD license.
* (See LICENSE file in the distribution.)
*
*/
#include "sqe.h"
static void
do_accept(struct socket_info *lsi)
{
struct sockaddr_in addr;
int fd;
unsigned len;
len = sizeof(addr);
if ( (fd = accept(lsi->fd, (struct sockaddr *)&addr, &len)) < 0)
croak(1, "do_accept: accept");
if (!opt_quiet)
fprintf(stderr, "incoming connection from %s!\n", inet_ntoa(addr.sin_addr));
new_client_connection(fd);
}
void
create_listening_socket(int port)
{
int fd, on;
struct sockaddr_in servaddr;
struct socket_info *si;
fd = socket(PF_INET, SOCK_STREAM, 0);
if (fd < 0)
croak(1, "create_listening_socket: socket");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = PF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
servaddr.sin_port = htons(port);
on = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < 0)
croak(1, "create_listening_socket: setsockopt of SO_REUSEADDR error");
if (bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
croak(1, "create_listening_socket: bind");
if (listen(fd, 1024) < 0)
croak(1, "create_listening_socket: listen");
si = new_socket_info(fd);
on_read(si, do_accept);
}