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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
typedef struct DHandle {
u64 type;
} DHandle;
b32 d_init(void) {
WSADATA data;
int error;
if (WSAStartup(MAKEWORD(2, 2), &data)) {
error = WSAGetLastError();
cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "WsaStartup failed, code: %d.", (s64)error);
return false;
}
return true;
}
extern String d_hostname_ip_get(String host, Allocator alloc) {
char *host_cstr;
Allocator talloc;
int err;
String ip;
talloc = un_alloc_temp_get();
host_cstr = (char *) un_string_to_cstring(host, talloc);
// @note, host_info can return multiple ip addresses?
HOSTENT *host_info = gethostbyname(host_cstr);
if (!host_info) {
err = WSAGetLastError();
switch (err) {
case WSANOTINITIALISED:
cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: disgrace wasn't initialized, run d_init() before this call.");
break;
case WSAENETDOWN:
cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: network error.");
break;
case WSATRY_AGAIN:
cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: host not found (WSATRY_AGAIN).");
break;
case WSAHOST_NOT_FOUND:
cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: host not found (WSAHOST_NOT_FOUND).");
break;
case WSANO_DATA:
cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: no host data (WSA_NO_DATA).");
break;
case WSAEFAULT:
cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: host name is not valid.");
break;
default:
cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: unspecified error.");
break;
}
return CLITERAL(String) { 0 };
}
if (host_info) {
assert(host_info->h_addrtype == AF_INET);
assert(host_info->h_length >= sizeof(struct in_addr));
ip = un_string_from_cstring(inet_ntoa(*(struct in_addr *)*host_info->h_addr_list));
return un_string_copy(ip, alloc);
}
return CLITERAL(String) { 0 };
}
DHandle* d_tcp_connect(String ip, u16 port) {
SOCKET sock;
struct sockaddr_in addr_info;
char *ip_addr_cstr;
ip_addr_cstr = (char *) un_string_to_cstring(ip, un_alloc_temp_get());
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
return NULL;
}
addr_info.sin_family = AF_INET;
addr_info.sin_addr.s_addr = inet_addr(ip_addr_cstr);
addr_info.sin_port = htons(port);
//connect()
}
|