File: serversocket.cc

package info (click to toggle)
crossroads 2.65-1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 2,664 kB
  • ctags: 355
  • sloc: cpp: 4,212; perl: 1,658; xml: 269; makefile: 186; sh: 46
file content (52 lines) | stat: -rw-r--r-- 1,645 bytes parent folder | download | duplicates (2)
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
#include "sys"
#include "error/error"
#include "profiler/profiler"
#include "config/config"

int serversocket (string addr, int port, string desc, Servertype::Type type) {
    PROFILE("serversocket");
    
    // Create the server socket, set options
    int sock;
    if (type != Servertype::t_udp)
	sock = socket(PF_INET, SOCK_STREAM, 0);
    else
	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock < 0)
	throw Error("Failed to create " + desc + " socket: " +
		    strerror(errno));    
    int val = 1;
    if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)))
	throw Error("Failed to set socket options for " +
		    desc + ": " + strerror(errno));

    // Prepare binding
    struct sockaddr_in saddr;
    memset (&saddr, 0, sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(port);

    // Assign interface to listen to
    if (addr[0] != '0') {
	msg ("Binding " + desc + " to specific IP address " + addr + "\n");
	if ( (saddr.sin_addr.s_addr = inet_addr (addr.c_str())) == INADDR_NONE )
	    throw Error("Cannot convert " + desc + " IP '" +
			addr + "' to network bytes");
    } else {
	msg ("Binding " + desc + " to all local IP addresses\n");
	saddr.sin_addr.s_addr = htonl (INADDR_ANY);
    }
    
    // Bind and listen
    if (bind (sock, (sockaddr*) &saddr, sizeof(saddr)) < 0)
	throw Error("Failed to bind " + desc +
		    " to IP/port: " + strerror(errno));
    if (type != Servertype::t_udp)
	if (listen (sock, 5) < 0)
	    throw Error("Failed to listen to " + desc +
			" IP/port: " + strerror(errno));

    msg ("Server for " + desc + " listening\n");

    return (sock);
}