static struct net_connection* start_listening_socket(const char* bind_addr, uint16_t port, int backlog, struct hub_info* hub) { struct net_connection* server; struct sockaddr_storage addr; socklen_t sockaddr_size; int sd, ret; if (ip_convert_address(bind_addr, port, (struct sockaddr*) &addr, &sockaddr_size) == -1) { return 0; } sd = net_socket_create(addr.ss_family, SOCK_STREAM, IPPROTO_TCP); if (sd == -1) { return 0; } if ((net_set_reuseaddress(sd, 1) == -1) || (net_set_nonblocking(sd, 1) == -1)) { net_close(sd); return 0; } ret = net_bind(sd, (struct sockaddr*) &addr, sockaddr_size); if (ret == -1) { LOG_ERROR("hub_start_service(): Unable to bind to TCP local address. errno=%d, str=%s", net_error(), net_error_string(net_error())); net_close(sd); return 0; } ret = net_listen(sd, backlog); if (ret == -1) { LOG_ERROR("hub_start_service(): Unable to listen to socket"); net_close(sd); return 0; } server = net_con_create(); net_con_initialize(server, sd, net_on_accept, hub, NET_EVENT_READ); return server; }
static int net_connect_job_process(struct net_connect_job* job) { int sd; if (!job->con) { sd = net_socket_create(job->addr.ss_family, SOCK_STREAM, IPPROTO_TCP); if (sd == -1) { LOG_DEBUG("net_connect_job_process: Unable to create socket!"); net_connect_callback(job->handle, net_connect_status_socket_error, NULL); return -1; // FIXME } job->con = net_con_create(); net_con_initialize(job->con, sd, net_connect_job_internal_cb, job, NET_EVENT_WRITE); net_con_set_timeout(job->con, TIMEOUT_CONNECTED); // FIXME: Use a proper timeout value! } return net_connect_job_check(job); }
static void test_request() { LOG_TEST_START; __block unsigned int requestCount = 0; bool requestAck = true; // true unless error NetError netError; static const char * localhost = "0.0.0.0"; // Listening on all network interfaces // Receive Socket net_socket_t receiveSocket = net_socket_create(&netError, AF_INET, localhost, 0); assert(!netError); net_addr_t receiveSocketAddr; net_socket_local_addr(receiveSocket, &receiveSocketAddr); net_socket_receive_block_t testReceiveSocketBlock = Block_copy(^(net_packet_t packet) { assert(net_packet_len(packet) == testRequest1_length); // testRequest1 assert(memcmp(testRequest1, packet->data, net_packet_len(packet)) == 0); // testRequest1 ++requestCount; net_packet_set_data(packet, testResponse1, testResponse1_length); net_socket_send(receiveSocket, packet); // testResponse1 net_packet_release(receiveSocket, packet); });