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() }