#include "c_Test.h" #include "c_SocketStream.h" #include "c_BinaryOutStream.h" #include "c_BinaryInStream.h" /* 模拟简单的跨平台 Socket Pair 创建逻辑 */ static void CreateLocalSocketPair(c_socket_t* listener, c_socket_t* client, c_socket_t* server) { c_Socket_Init(); *listener = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_port = 0; /* 让 OS 自适应分派空闲端口 */ bind(*listener, (struct sockaddr*)&addr, sizeof(addr)); listen(*listener, 1); int addr_len = sizeof(addr); getsockname(*listener, (struct sockaddr*)&addr, &addr_len); *client = socket(AF_INET, SOCK_STREAM, 0); connect(*client, (struct sockaddr*)&addr, sizeof(addr)); *server = accept(*listener, NULL, NULL); } TEST_CASE(test_polymorphic_socket_streams_network_pipeline) { c_socket_t listener, client_sock, server_sock; CreateLocalSocketPair(&listener, &client_sock, &server_sock); /* -------------------------------------------------------------------------------------------------------------- */ /* 发送方逻辑:构建网络流并将二进制打包器拼装到虚函数表抽象句柄上 */ c_OutStream_t* net_out = NULL; c_err_t err = c_SocketOutStream_Create(&net_out, client_sock, NULL); ASSERT_INT_EQ(C_SUCCESS, err); c_BinaryOutStream_t bin_out; c_BinaryOutStream_Init(&bin_out, net_out); /* 写入不常规宽度的非对齐 bit 流数据 */ c_BinaryOutStream_WriteBits(&bin_out, 0x05, 3); /* 3 bits */ c_BinaryOutStream_WriteUInt32(&bin_out, 0xABCDEF12); /* 32 bits */ c_BinaryOutStream_Flush(&bin_out); /* -------------------------------------------------------------------------------------------------------------- */ /* 接收方逻辑:接收网络多态流并解包验证 */ c_InStream_t* net_in = NULL; err = c_SocketInStream_Create(&net_in, server_sock, NULL); ASSERT_INT_EQ(C_SUCCESS, err); c_BinaryInStream_t bin_in; c_BinaryInStream_Init(&bin_in, net_in); uint32_t val_bits = 0; err = c_BinaryInStream_ReadBits(&bin_in, 3, &val_bits); ASSERT_INT_EQ(C_SUCCESS, err); ASSERT_LL_EQ(0x05, val_bits); uint32_t val_u32 = 0; err = c_BinaryInStream_ReadUInt32(&bin_in, &val_u32); ASSERT_INT_EQ(C_SUCCESS, err); ASSERT_LL_EQ(0xABCDEF12, val_u32); /* -------------------------------------------------------------------------------------------------------------- */ /* 清理所有多态虚函数组件及底层网络套接字句柄描述符 */ c_OutStream_Destroy(net_out); c_InStream_Destroy(net_in); c_Socket_Close(client_sock); c_Socket_Close(server_sock); c_Socket_Close(listener); c_Socket_Destroy(); } int main(void) { TEST_START(Polymorphic_SocketStream_Network_Pipeline_Suite); RUN_TEST(test_polymorphic_socket_streams_network_pipeline); TEST_REPORT(); RETURN_TEST_STATUS; }