SockInfo *sock_connect(const gchar *hostname, gushort port) { #ifdef G_OS_WIN32 SOCKET sock; #else gint sock; #endif #ifdef INET6 if ((sock = sock_connect_by_getaddrinfo(hostname, port)) < 0) return NULL; #else #ifdef G_OS_WIN32 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { g_warning("socket() failed: %d\n", WSAGetLastError()); #else if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); #endif /* G_OS_WIN32 */ return NULL; } if (sock_connect_by_hostname(sock, hostname, port) < 0) { if (errno != 0) perror("connect"); close(sock); return NULL; } #endif /* INET6 */ return sockinfo_from_fd(hostname, port, sock); } static void sock_address_list_free(GList *addr_list) { GList *cur; for (cur = addr_list; cur != NULL; cur = cur->next) { SockAddrData *addr_data = (SockAddrData *)cur->data; g_free(addr_data->addr); g_free(addr_data); } g_list_free(addr_list); }
SockInfo *sock_connect(const gchar *hostname, gushort port) { SockDesc sock; SockInfo *sockinfo; #ifdef INET6 sock = sock_connect_by_getaddrinfo(hostname, port); if (!SOCKET_IS_VALID(sock)) return NULL; #else sock = socket(AF_INET, SOCK_STREAM, 0); if (!SOCKET_IS_VALID(sock)) { #ifdef G_OS_WIN32 g_warning("socket() failed: %ld\n", WSAGetLastError()); #else perror("socket"); #endif /* G_OS_WIN32 */ return NULL; } sock_set_buffer_size(sock); if (sock_connect_by_hostname(sock, hostname, port) < 0) { if (errno != 0) perror("connect"); fd_close(sock); return NULL; } #endif /* INET6 */ sockinfo = g_new0(SockInfo, 1); sockinfo->sock = sock; sockinfo->sock_ch = g_io_channel_unix_new(sock); sockinfo->hostname = g_strdup(hostname); sockinfo->port = port; sockinfo->state = CONN_ESTABLISHED; sockinfo->flags = SYL_SOCK_CHECK_IO; sock_list = g_list_prepend(sock_list, sockinfo); g_usleep(100000); return sockinfo; }