Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve kcp implementation #437

Merged
merged 11 commits into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions tests/echo_client/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@ void run_echo_client(const char* ip, int port, const char* protocol)

auto packet = std::move(event->packet());
total_bytes_transferred += static_cast<int>(packet.size());
printf("[latency: %lf(ms), bytes=%zu]", diff / 1000.0, packet.size());
fwrite(packet.data(), packet.size(), 1, stdout);
printf("latency: %lf(ms)\n", diff / 1000.0);
printf("\n");
fflush(stdout);
break;
}
Expand All @@ -50,13 +51,12 @@ void run_echo_client(const char* ip, int port, const char* protocol)
send_timer.async_wait([transport, index, protocol](io_service& service) -> bool {
obstream obs;
obs.write_byte('[');
obs.write_bytes(protocol, strlen(protocol));
obs.write_bytes(protocol, static_cast<int>(strlen(protocol)));
obs.write_bytes("] Hello, ");
auto n = 4096 - obs.length();
obs.fill_bytes(n - 1, '1');
obs.write_byte(',');
printf("Sending %zu bytes ...\n", obs.length());
auto n = 4096 - static_cast<int>(obs.length());
obs.fill_bytes(n, 'a');
service.write(transport, std::move(obs.buffer()));
printf("sent %zu bytes ...\n", obs.length());
s_last_send_time[index] = highp_clock();
return false;
});
Expand Down
82 changes: 38 additions & 44 deletions tests/speed/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,53 +43,46 @@ Test detail, please see: https://github.com/yasio/yasio/blob/master/benchmark.md
#define SPEEDTEST_TRANSFER_PROTOCOL SPEEDTEST_PROTO_KCP

#if SPEEDTEST_TRANSFER_PROTOCOL == SPEEDTEST_PROTO_TCP
# define SPEEDTEST_DEFAULT_KIND YCK_TCP_CLIENT | SPEEDTEST_SSL_MASK
# define SPEEDTEST_SERVER_KIND YCK_TCP_SERVER
# define SPEEDTEST_CLIENT_KIND YCK_TCP_CLIENT | SPEEDTEST_SSL_MASK
#elif SPEEDTEST_TRANSFER_PROTOCOL == SPEEDTEST_PROTO_UDP
# define SPEEDTEST_DEFAULT_KIND YCK_UDP_CLIENT
# define SPEEDTEST_SERVER_KIND YCK_UDP_SERVER
# define SPEEDTEST_CLIENT_KIND YCK_UDP_CLIENT
#elif SPEEDTEST_TRANSFER_PROTOCOL == SPEEDTEST_PROTO_KCP
# define SPEEDTEST_DEFAULT_KIND YCK_KCP_CLIENT
# define SPEEDTEST_SERVER_KIND YCK_KCP_SERVER
# define SPEEDTEST_CLIENT_KIND YCK_KCP_CLIENT
#else
# error "please define SPEEDTEST_TRANSFER_PROTOCOL to one of SPEEDTEST_PROTO_TCP, SPEEDTEST_PROTO_UDP, SPEEDTEST_PROTO_KCP"
#endif

// speedtest kcp mtu to max mss of udp (65535 - 20(ip_hdr) - 8(udp_hdr))
#define SPEEDTEST_KCP_MTU 65507
#define SPEEDTEST_UDP_MSS 65507
#define SPEEDTEST_KCP_MTU SPEEDTEST_UDP_MSS
#define SPEEDTEST_KCP_MSS (SPEEDTEST_KCP_MTU - 24)

#if SPEEDTEST_TRANSFER_PROTOCOL == SPEEDTEST_PROTO_TCP
namespace speedtest
{
enum
{
RECEIVER_PORT = 3002,
SENDER_PORT = RECEIVER_PORT,
# if !SPEEDTEST_VIA_UDS
RECEIVER_CHANNEL_KIND = YCK_TCP_SERVER | SPEEDTEST_SSL_MASK,
SENDER_CHANNEL_KIND = SPEEDTEST_DEFAULT_KIND,
# else
RECEIVER_CHANNEL_KIND = YCK_TCP_SERVER | YCM_UDS,
SENDER_CHANNEL_KIND = SPEEDTEST_DEFAULT_KIND | YCM_UDS,
# endif
};
} // namespace speedtest
# if !SPEEDTEST_VIA_UDS
# define SPEEDTEST_SOCKET_NAME "127.0.0.1"
# else
# define SPEEDTEST_SOCKET_NAME "speedtest.socket"
# endif
#if !SPEEDTEST_VIA_UDS
RECEIVER_CHANNEL_KIND = SPEEDTEST_SERVER_KIND | SPEEDTEST_SSL_MASK,
SENDER_CHANNEL_KIND = SPEEDTEST_CLIENT_KIND,
#else
namespace speedtest
{
enum
{
RECEIVER_PORT = 3001,
SENDER_PORT = 3002,
RECEIVER_CHANNEL_KIND = SPEEDTEST_DEFAULT_KIND,
SENDER_CHANNEL_KIND = SPEEDTEST_DEFAULT_KIND,
RECEIVER_CHANNEL_KIND = SPEEDTEST_SERVER_KIND | YCM_UDS,
SENDER_CHANNEL_KIND = SPEEDTEST_CLIENT_KIND | YCM_UDS,
#endif
};
#if !SPEEDTEST_VIA_UDS
# define SPEEDTEST_SOCKET_NAME "127.0.0.1"
} // namespace speedtest
# define SPEEDTEST_LISTEN_NAME "0.0.0.0"
#else

# define SPEEDTEST_SOCKET_NAME "speedtest.socket"
# define SPEEDTEST_LISTEN_NAME SPEEDTEST_SOCKET_NAME
#endif
} // namespace speedtest

static const double s_send_limit_time = 10; // max send time in seconds

Expand All @@ -99,7 +92,7 @@ static long long s_recv_total_bytes = 0;
static double s_send_speed = 0; // bytes/s
static double s_recv_speed = 0;

static const long long s_kcp_send_interval = 10; // (us) in microseconds
static const long long s_kcp_send_interval = 100; // (us) in milliseconds
static const uint32_t s_kcp_conv = 8633; // can be any, but must same with two endpoint

static const char* proto_name(int myproto)
Expand Down Expand Up @@ -143,7 +136,7 @@ static void print_speed_detail(double interval, double time_elapsed)
#if defined(YASIO_ENABLE_KCP)
void setup_kcp_transfer(transport_handle_t handle)
{
auto kcp_handle = static_cast<io_transport_kcp*>(handle)->internal_object();
auto kcp_handle = static_cast<io_transport_kcp*>(handle)->internal_object();
::ikcp_setmtu(kcp_handle, SPEEDTEST_KCP_MTU);
::ikcp_wndsize(kcp_handle, 256, 1024);
}
Expand Down Expand Up @@ -241,18 +234,13 @@ void start_sender(io_service& service)
printf("Start trasnfer test via %s after 170ms...\n", proto_name(SPEEDTEST_TRANSFER_PROTOCOL));
std::this_thread::sleep_for(std::chrono::milliseconds(170));

#if SPEEDTEST_TRANSFER_PROTOCOL != SPEEDTEST_PROTO_TCP
service.set_option(YOPT_C_LOCAL_PORT, 0, speedtest::RECEIVER_PORT);
#endif

#if SPEEDTEST_TRANSFER_PROTOCOL == SPEEDTEST_PROTO_KCP
service.set_option(YOPT_C_KCP_CONV, 0, s_kcp_conv);
#endif

service.open(0, speedtest::SENDER_CHANNEL_KIND);
}

static io_service* s_sender;
void start_receiver(io_service& service)
{
static long long time_start = yasio::highp_clock<>();
Expand Down Expand Up @@ -297,25 +285,31 @@ void start_receiver(io_service& service)
}
});

#if SPEEDTEST_TRANSFER_PROTOCOL != SPEEDTEST_PROTO_TCP
service.set_option(YOPT_C_LOCAL_PORT, 0, speedtest::SENDER_PORT);
#endif

#if SPEEDTEST_TRANSFER_PROTOCOL == SPEEDTEST_PROTO_KCP
service.set_option(YOPT_C_KCP_CONV, 0, s_kcp_conv);
#endif

service.open(0, speedtest::RECEIVER_CHANNEL_KIND);
}

int main(int, char**)
int main(int argc, char** argv)
{
io_hostent receiver_ep(SPEEDTEST_SOCKET_NAME, speedtest::RECEIVER_PORT), sender_ep(SPEEDTEST_SOCKET_NAME, speedtest::SENDER_PORT);
io_hostent receiver_ep(SPEEDTEST_LISTEN_NAME, speedtest::RECEIVER_PORT), sender_ep(SPEEDTEST_SOCKET_NAME, speedtest::SENDER_PORT);
io_service receiver(&receiver_ep, 1), sender(&sender_ep, 1);

s_sender = &sender;
start_receiver(receiver);
start_sender(sender);
const char* mode = "host";
if (argc > 1)
mode = argv[1];

if (cxx20::ic::iequals(mode, "server"))
start_receiver(receiver);
else if (cxx20::ic::iequals(mode, "client"))
start_sender(sender);
else
{
start_receiver(receiver);
start_sender(sender);
}

static long long time_start = yasio::highp_clock<>();
while (true)
Expand Down
2 changes: 1 addition & 1 deletion thirdparty
3 changes: 0 additions & 3 deletions yasio/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,6 @@ SOFTWARE.
// The default ttl of multicast
#define YASIO_DEFAULT_MULTICAST_TTL (int)128

// The max internet buffer size
#define YASIO_INET_BUFFER_SIZE 65536

// The max pdu buffer length, avoid large memory allocation when application decode a huge length.
#define YASIO_MAX_PDU_BUFFER_SIZE static_cast<int>(1 * 1024 * 1024)

Expand Down
Loading
Loading