Files
STM32F4-Base/IEC60870-Slave/test/iec104_net_pending_input_test.c
T
STF 4c55544f05
CI / L0 静态门禁 (pre-commit) (push) Failing after 45s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 42s
通信协议代码
2026-10-26 08:31:48 -04:00

71 lines
3.4 KiB
C

/* Windows回环验证:Pending_Input只读快照、部分读取、耗尽与EOF。 */
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <windows.h>
#include "IEC104_Net.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CHECK(x) do { if (!(x)) { fprintf(stderr, "line %d: %s\n", __LINE__, #x); exit(1); } } while (0)
int main(void)
{
IEC104_NetSocket_t listener, accepted;
IEC104_NetPeer_t peer;
IEC104_NetIoResult_t received;
SOCKET client;
struct sockaddr_in address;
uint8_t sent[64], copy[64];
uint16_t port;
uint32_t count, ready, index;
uint64_t deadline;
int error;
for (index = 0; index < sizeof(sent); ++index) { sent[index] = (uint8_t)(index * 7U); }
CHECK(IEC104_Net_Init(&error) == IEC104_NET_OK);
CHECK(IEC104_Net_Listen("127.0.0.1", 0, &listener, &port, &error) == IEC104_NET_OK);
client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
CHECK(client != INVALID_SOCKET);
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
address.sin_port = htons(port);
CHECK(connect(client, (const struct sockaddr *)&address, sizeof(address)) == 0);
CHECK(IEC104_Net_Wait(listener, IEC104_NET_INVALID_SOCKET, IEC104_NET_EVENT_ACCEPT, 1000,
&ready, &error) == IEC104_NET_OK);
CHECK(ready & IEC104_NET_EVENT_ACCEPT);
CHECK(IEC104_Net_Accept(listener, &accepted, &peer, &error) == IEC104_NET_OK);
CHECK(IEC104_Net_Pending_Input(accepted, &count, &error) == IEC104_NET_OK && count == 0);
CHECK(send(client, (const char *)sent, sizeof(sent), 0) == sizeof(sent));
deadline = IEC104_Net_Now_Ms() + 1000;
do {
CHECK(IEC104_Net_Pending_Input(accepted, &count, &error) == IEC104_NET_OK);
if (count == sizeof(sent)) { break; }
Sleep(1);
} while (IEC104_Net_Now_Ms() < deadline);
CHECK(count == sizeof(sent));
CHECK(IEC104_Net_Pending_Input(accepted, &count, &error) == IEC104_NET_OK && count == sizeof(sent));
received = IEC104_Net_Recv(accepted, copy, 17);
CHECK(received.result == IEC104_NET_OK && received.transferred == 17);
CHECK(IEC104_Net_Pending_Input(accepted, &count, &error) == IEC104_NET_OK && count == sizeof(sent) - 17);
received = IEC104_Net_Recv(accepted, copy + 17, sizeof(copy) - 17);
CHECK(received.result == IEC104_NET_OK && received.transferred == sizeof(copy) - 17);
CHECK(memcmp(sent, copy, sizeof(copy)) == 0);
CHECK(IEC104_Net_Pending_Input(accepted, &count, &error) == IEC104_NET_OK && count == 0);
CHECK(shutdown(client, SD_SEND) == 0);
CHECK(IEC104_Net_Wait(IEC104_NET_INVALID_SOCKET, accepted, IEC104_NET_EVENT_READ, 1000,
&ready, &error) == IEC104_NET_OK && (ready & IEC104_NET_EVENT_READ));
CHECK(IEC104_Net_Pending_Input(accepted, &count, &error) == IEC104_NET_OK && count == 0);
CHECK(IEC104_Net_Recv(accepted, copy, sizeof(copy)).result == IEC104_NET_EOF);
count = 123;
CHECK(IEC104_Net_Pending_Input(IEC104_NET_INVALID_SOCKET, &count, &error) == IEC104_NET_ERROR);
CHECK(count == 123 && error != 0);
CHECK(IEC104_Net_Pending_Input(accepted, NULL, &error) == IEC104_NET_ERROR);
CHECK(IEC104_Net_Close(accepted, &error) == IEC104_NET_OK);
CHECK(IEC104_Net_Close(listener, &error) == IEC104_NET_OK);
CHECK(closesocket(client) == 0);
IEC104_Net_Cleanup();
puts("Windows Net pending input: loopback passed");
return 0;
}