1 | #include "Flatline.h" |
---|
2 | |
---|
3 | bool Net_Listen(uint16_t port, bool (*packet_callback)(char* data, int datalen, int from)) |
---|
4 | { |
---|
5 | int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
---|
6 | |
---|
7 | if (sock < 0) |
---|
8 | { |
---|
9 | DDrStartupMessage("could not create socket"); |
---|
10 | return false; |
---|
11 | } |
---|
12 | |
---|
13 | sockaddr_in address; |
---|
14 | memset(&address, 0, sizeof(sockaddr_in)); |
---|
15 | address.sin_family = AF_INET; |
---|
16 | address.sin_addr.s_addr = htonl(INADDR_ANY); |
---|
17 | address.sin_port = htons(port); |
---|
18 | |
---|
19 | if (bind(sock, (sockaddr*)&address, sizeof(sockaddr_in)) < 0) |
---|
20 | { |
---|
21 | DDrStartupMessage("could not bind port %d", port); |
---|
22 | closesocket(sock); |
---|
23 | return false; |
---|
24 | } |
---|
25 | |
---|
26 | char data[65537]; |
---|
27 | data[sizeof(data) - 1] = '\0'; |
---|
28 | sockaddr_in from; |
---|
29 | int recvlen; |
---|
30 | for (;;) |
---|
31 | { |
---|
32 | int fromlen = sizeof(sockaddr_in); |
---|
33 | memset(&from, 0, sizeof(sockaddr_in)); |
---|
34 | recvlen = recvfrom(sock, data, sizeof(data) - 1, 0, (sockaddr*)&from, (void*)&fromlen); |
---|
35 | if (!packet_callback(data, recvlen, ntohl(from.sin_addr.s_addr))) |
---|
36 | break; |
---|
37 | } |
---|
38 | closesocket(sock); |
---|
39 | return true; |
---|
40 | } |
---|
41 | |
---|
42 | int Net_CreateSocket(uint16_t port) |
---|
43 | { |
---|
44 | int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
---|
45 | |
---|
46 | if (sock < 0) |
---|
47 | { |
---|
48 | DDrStartupMessage("could not create socket"); |
---|
49 | return -1; |
---|
50 | } |
---|
51 | |
---|
52 | sockaddr_in address; |
---|
53 | memset(&address, 0, sizeof(sockaddr_in)); |
---|
54 | address.sin_family = AF_INET; |
---|
55 | address.sin_addr.s_addr = htonl(INADDR_ANY); |
---|
56 | address.sin_port = htons(port); |
---|
57 | |
---|
58 | if (bind(sock, (sockaddr*)&address, sizeof(sockaddr_in)) < 0) |
---|
59 | { |
---|
60 | DDrStartupMessage("could not bind port %d", port); |
---|
61 | return false; |
---|
62 | } |
---|
63 | |
---|
64 | unsigned long nonBlocking = 1; |
---|
65 | if (ioctlsocket(sock, FIONBIO, &nonBlocking)) |
---|
66 | { |
---|
67 | DDrStartupMessage("failed to set non-blocking socket"); |
---|
68 | return false; |
---|
69 | } |
---|
70 | |
---|
71 | return sock; |
---|
72 | } |
---|
73 | |
---|
74 | bool Net_Send(int socket, int ip, uint16_t port, char* data, int datalen) |
---|
75 | { |
---|
76 | sockaddr_in address; |
---|
77 | memset(&address, 0, sizeof(sockaddr_in)); |
---|
78 | address.sin_family = AF_INET; |
---|
79 | address.sin_addr.s_addr = ip; |
---|
80 | address.sin_port = htons(port); |
---|
81 | |
---|
82 | return sendto(socket, data, datalen, 0, (sockaddr*)&address, sizeof(address)); |
---|
83 | } |
---|
84 | |
---|
85 | void Net_CloseSocket(int sock) |
---|
86 | { |
---|
87 | closesocket(sock); |
---|
88 | } |
---|
89 | |
---|
90 | bool FLrListen_PacketCallback(char* data, int datalen, int from) |
---|
91 | { |
---|
92 | static int recieved = 0; |
---|
93 | |
---|
94 | data[datalen] = '\0'; |
---|
95 | if (!strcmp(data, "hi")) |
---|
96 | printf("\r%d packets recieved ", ++recieved); |
---|
97 | return true; |
---|
98 | } |
---|
99 | |
---|
100 | bool FLrListen_Run() |
---|
101 | { |
---|
102 | return Net_Listen(27777, FLrListen_PacketCallback); |
---|
103 | } |
---|