-
-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathServerHelper.cpp
More file actions
52 lines (40 loc) · 1.4 KB
/
ServerHelper.cpp
File metadata and controls
52 lines (40 loc) · 1.4 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "ServerHelper.h"
struct sockaddr_in bind_socket(SOCKET socket, const char *host) {
struct sockaddr_in server_address;
socklen_t address_length = sizeof(server_address);
server_address.sin_family = AF_INET;
#ifdef _WIN32
inet_pton(server_address.sin_family, host, (void *)&server_address.sin_addr);
#else
server_address.sin_addr.s_addr = inet_addr(host);
#endif // _WIN32
// Find available port.
int port = 1111;
server_address.sin_port = htons(port);
// If the port is available the bind() will return 0.
int bind_result = bind(socket, (sockaddr *)&server_address, address_length);
while (bind_result != 0) {
++port;
server_address.sin_port = htons(port);
bind_result = bind(socket, (sockaddr *)&server_address, address_length);
}
return server_address;
}
DeviceServerData *create_server(SOCKET device_socket, const char *host) {
#ifdef _WIN32
// Start WinSock2
WSADATA wsa_data;
WORD dll_version = MAKEWORD(2, 1);
if (WSAStartup(dll_version, &wsa_data) != 0) {
return nullptr;
}
#endif // _WIN32
SOCKET server_socket = socket(AF_INET, SOCK_STREAM, NULL);
struct sockaddr_in server_address = bind_socket(server_socket, host);
listen(server_socket, SOMAXCONN);
DeviceServerData *result = new DeviceServerData();
result->server_socket = server_socket;
result->device_socket = device_socket;
result->server_address = server_address;
return result;
}