5 #include <sys/select.h>
6 #include <sys/socket.h>
11 #include "scancodes.h"
13 const int tcp_port_rdp = 3389;
14 int create_server_socket();
18 int server_sock = create_server_socket();
19 int sock_serv, sock_real, sock_fake;
20 unsigned char buf[4096], buf1[4096], buf2[4096];
23 tcp_recv_connect(server_sock);
24 sock_serv = tcp_get_socket();
26 printf("Got connection.\n");
28 sock_real = tcp_connect("glasur.uka.no", 3389);
29 sock_fake = tcp_connect("127.0.0.1", 3390);
34 FD_SET(sock_serv, &readfs);
35 FD_SET(sock_real, &readfs);
36 FD_SET(sock_fake, &readfs);
38 select(FD_SETSIZE, &readfs, NULL, NULL, NULL);
40 if (FD_ISSET(sock_serv, &readfs)) {
41 // data from the client
42 len1 = read(sock_serv, buf, 4096);
50 for (i = 0; i < len1; ++i)
51 printf(" 0x%02x", buf[i]);
54 if (write(sock_real, buf, len1) != len1) {
58 if (write(sock_fake, buf, len1) != len1) {
62 } else if (FD_ISSET(sock_real, &readfs) || FD_ISSET(sock_fake, &readfs)) {
65 if (FD_ISSET(sock_real, &readfs)) {
66 len1 = read(sock_real, buf1, 4096);
72 if (FD_ISSET(sock_fake, &readfs)) {
73 len2 = read(sock_fake, buf2, 4096);
81 for (i = 0; i < len1; ++i)
82 printf(" 0x%02x", buf1[i]);
86 for (i = 0; i < len2; ++i)
87 printf(" 0x%02x", buf2[i]);
90 if (write(sock_serv, buf1, len1) != len1) {
96 // give the clients a bit of time to synchronize
101 int create_server_socket()
103 int server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
104 const unsigned int one = 1, zero = 0;
105 struct sockaddr_in addr;
108 setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
109 ioctl(server_sock, FIONBIO, &zero);
111 addr.sin_family = AF_INET;
112 addr.sin_addr.s_addr = INADDR_ANY;
113 addr.sin_port = htons(tcp_port_rdp);
116 err = bind(server_sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
121 /* try to recover from recoverable errors... */
122 if (errno == ENOMEM || errno == EADDRINUSE) {
123 puts("Waiting 1 sec before trying again...");
132 listen(server_sock, 20);