]> git.sesse.net Git - rdpsrv/blob - rdpsrv.cpp
Add Makefile. (bah)
[rdpsrv] / rdpsrv.cpp
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <sys/socket.h>
6 #include <sys/ioctl.h>
7 #include <arpa/inet.h>
8
9 static const int RDP_PORT = 3389;
10 int create_server_socket();
11
12 int main()
13 {
14         int server_sock = create_server_socket();
15         for ( ;; ) {
16                 sockaddr_in sin;
17                 socklen_t len;
18                 int sock = accept(server_sock, (sockaddr *)&sin, &len);
19         
20                 if (sock == -1) {
21                         perror("accept()");
22                         exit(1);
23                 }
24
25                 printf("Got socket.\n");
26
27                 close(sock);
28         }
29 }
30
31 int create_server_socket()
32 {
33         int server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
34         const unsigned int one = 1, zero = 0;
35         struct sockaddr_in addr;
36         int err;
37
38         setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
39         ioctl(server_sock, FIONBIO, &zero);
40
41         addr.sin_family = AF_INET;
42         addr.sin_addr.s_addr = INADDR_ANY;
43         addr.sin_port = htons(RDP_PORT);
44
45         do {
46                 err = bind(server_sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
47
48                 if (err == -1) {
49                         perror("bind()");
50
51                         /* try to recover from recoverable errors... */
52                         if (errno == ENOMEM || errno == EADDRINUSE) {
53                                 puts("Waiting 1 sec before trying again...");
54                                 sleep(1);
55                         } else {
56                                 puts("Giving up.");
57                                 exit(1);
58                         }
59                 }
60         } while (err == -1);
61
62         listen(server_sock, 20);
63         return server_sock;
64 }
65