-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUDPSocket.c
More file actions
39 lines (34 loc) · 1.03 KB
/
UDPSocket.c
File metadata and controls
39 lines (34 loc) · 1.03 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
#include "UDPProxy.h"
/* print error message and exit */
void die(char *msg) {
perror(msg);
exit(1);
}
/* returns fd for socket bound to ip:port */
int bind_sock(int ip, int port) {
int fd, flags = 0x01;
struct sockaddr_in addr;
memset((char *) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(ip);
addr.sin_port = htons(port);
fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (fd < 0) {
die("Socket error");
}
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flags, sizeof(int)) < 0) {
die("Error setting sockopt SO_REUSEADDR");
}
/* for tproxy */
if (setsockopt(fd, SOL_IP, IP_RECVORIGDSTADDR, &flags, sizeof(int)) < 0) {
die("Error setting sockopt IP_RECVORIGDSTADDR");
}
if (setsockopt(fd, SOL_IP, IP_TRANSPARENT, &flags, sizeof(int)) < 0) {
die ("Error setting sockopt IP_TRANSPARENT");
}
if(bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
die("Bind error");
}
printf("Bound socket to %d:%d\n", ip, port);
return fd;
}