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) |
3 |
> |
bool FLrServer_PacketCallback(char* data, int datalen, int from) |
4 |
|
{ |
5 |
|
static int recieved = 0; |
6 |
|
|
10 |
|
return true; |
11 |
|
} |
12 |
|
|
13 |
< |
bool FLrListen_Run() |
13 |
> |
bool FLrServer_Run() |
14 |
|
{ |
15 |
|
return Net_Listen(27777, FLrListen_PacketCallback); |
16 |
|
} |