71 lines
3.4 KiB
C
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;
|
|
}
|