1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-13 11:51:57 +00:00
srs/trunk/3rdparty/st-srs/utest/st_utest_tcp.cpp
2023-01-01 08:49:13 +08:00

92 lines
2.4 KiB
C++

/* SPDX-License-Identifier: MIT */
/* Copyright (c) 2013-2023 Winlin */
#include <st_utest.hpp>
#include <st.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define ST_UTEST_PORT 26878
#define ST_UTEST_TIMEOUT (100 * SRS_UTIME_MILLISECONDS)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// The utest for ping-pong TCP server coroutine.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void* tcp_server(void* /*arg*/)
{
int fd = -1;
st_netfd_t stfd = NULL;
StFdCleanup(fd, stfd);
fd = socket(AF_INET, SOCK_STREAM, 0);
ST_ASSERT_ERROR(fd == -1, fd, "Create socket");
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(ST_UTEST_PORT);
int v = 1;
int r0 = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int));
ST_ASSERT_ERROR(r0, r0, "Set SO_REUSEADDR");
r0 = ::bind(fd, (const sockaddr*)&addr, sizeof(addr));
ST_ASSERT_ERROR(r0, r0, "Bind socket");
r0 = ::listen(fd, 10);
ST_ASSERT_ERROR(r0, r0, "Listen socket");
stfd = st_netfd_open_socket(fd);
ST_ASSERT_ERROR(!stfd, fd, "Open ST socket");
st_netfd_t client = NULL;
StStfdCleanup(client);
client = st_accept(stfd, NULL, NULL, ST_UTEST_TIMEOUT);
ST_ASSERT_ERROR(!client, fd, "Accept client");
return NULL;
}
void* tcp_client(void* /*arg*/)
{
int fd = -1;
st_netfd_t stfd = NULL;
StFdCleanup(fd, stfd);
fd = socket(AF_INET, SOCK_STREAM, 0);
ST_ASSERT_ERROR(fd == -1, fd, "Create socket");
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(ST_UTEST_PORT);
stfd = st_netfd_open_socket(fd);
ST_ASSERT_ERROR(!stfd, fd, "Open ST socket");
int r0 = st_connect(stfd, (const sockaddr*)&addr, sizeof(addr), ST_UTEST_TIMEOUT);
ST_ASSERT_ERROR(r0, r0, "Connect to server");
return NULL;
}
VOID TEST(TcpTest, TcpConnection)
{
st_thread_t svr = st_thread_create(tcp_server, NULL, 1, 0);
EXPECT_TRUE(svr != NULL);
st_thread_t client = st_thread_create(tcp_client, NULL, 1, 0);
EXPECT_TRUE(client != NULL);
ST_COROUTINE_JOIN(svr, r0);
ST_COROUTINE_JOIN(client, r1);
ST_EXPECT_SUCCESS(r0);
ST_EXPECT_SUCCESS(r1);
}