static void blast_client_read_ack(blast_client_t* client) { const network_address_t* address = 0; char databuf[PACKET_DATABUF_SIZE]; size_t size = udp_socket_recvfrom(client->sock, databuf, sizeof(databuf), &address); while (size > 0) { packet_t* packet = (packet_t*)databuf; if (network_address_equal(address, socket_address_remote(client->sock))) { if (packet->type == PACKET_ACK) { packet_ack_t* ack = (packet_ack_t*)packet; blast_client_process_ack(client, ack->ack, packet->timestamp); } else if (packet->type == PACKET_TERMINATE) { log_info(HASH_BLAST, STRING_CONST("Client terminating due to TERMINATE packet from server")); client->state = BLAST_STATE_FINISHED; break; } } else { char buffer[NETWORK_ADDRESS_NUMERIC_MAX_LENGTH]; string_t addr = network_address_to_string(buffer, sizeof(buffer), address, true); log_warnf(HASH_BLAST, WARNING_SUSPICIOUS, STRING_CONST("Ignoring datagram from unknown host %.*s"), STRING_FORMAT(addr)); } size = udp_socket_recvfrom(client->sock, databuf, sizeof(databuf), &address); } }
static void* datagram_client_blocking_thread(void* arg) { int iloop; test_datagram_arg_t* darg = arg; socket_t* sock = darg->sock; network_address_t* target = darg->target; const network_address_t* address; char buffer[1024] = {0}; size_t send = 973; size_t recv; log_debugf(HASH_NETWORK, STRING_CONST("IO start on socket 0x%llx"), sock); for (iloop = 0; iloop < 512; ++iloop) { log_infof(HASH_NETWORK, STRING_CONST("UDP read/write pass %d"), iloop); EXPECT_EQ(udp_socket_sendto(sock, buffer, send, target), send); recv = udp_socket_recvfrom(sock, buffer, send, &address); EXPECT_EQ(recv, send); EXPECT_TRUE(network_address_equal(target, address)); thread_yield(); } log_infof(HASH_NETWORK, STRING_CONST("IO complete on socket 0x%llx"), sock); return 0; }
DECLARE_TEST(tcp, bind) { bool has_ipv4 = network_supports_ipv4(); bool has_ipv6 = network_supports_ipv6(); bool was_bound = false; unsigned int port; if (has_ipv4) { socket_t* sock = tcp_socket_allocate(); EXPECT_EQ(socket_address_local(sock), 0); EXPECT_EQ(socket_address_remote(sock), 0); EXPECT_EQ(socket_state(sock), SOCKETSTATE_NOTCONNECTED); for (port = 31890; !was_bound && (port < 32890); ++port) { network_address_t* address = network_address_ipv4_any(); network_address_ip_set_port(address, port); if (socket_bind(sock, address)) { EXPECT_NE(socket_address_local(sock), 0); EXPECT_EQ(socket_address_remote(sock), 0); EXPECT_EQ(socket_state(sock), SOCKETSTATE_NOTCONNECTED); EXPECT_TRUE(network_address_equal(socket_address_local(sock), address)); was_bound = true; } memory_deallocate(address); } EXPECT_TRUE(was_bound); socket_deallocate(sock); } if (has_ipv6) { socket_t* sock = tcp_socket_allocate(); was_bound = false; for (port = 31890; !was_bound && (port < 32890); ++port) { network_address_t* address = network_address_ipv6_any(); network_address_ip_set_port(address, port); if (socket_bind(sock, address)) { EXPECT_NE(socket_address_local(sock), 0); EXPECT_EQ(socket_address_remote(sock), 0); EXPECT_EQ(socket_state(sock), SOCKETSTATE_NOTCONNECTED); EXPECT_TRUE(network_address_equal(socket_address_local(sock), address)); was_bound = true; } memory_deallocate(address); } EXPECT_TRUE(was_bound); socket_deallocate(sock); } return 0; }