/* Windows回环验证:Pending_Input只读快照、部分读取、耗尽与EOF。 */ #define WIN32_LEAN_AND_MEAN #include #include #include "IEC104_Net.h" #include #include #include #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; }