#include #include #include #include #include #pragma comment(lib, "ws2_32.lib") #include "common.h" #define LOCAL_PORT 9001 #define PEER_PORT 9000 #define TIMEOUT_MS 500 int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s \n", argv[0]); return 1; } WSADATA wsa; WSAStartup(MAKEWORD(2,2), &wsa); SOCKET sock = socket(AF_INET6, SOCK_DGRAM, 0); struct sockaddr_in6 local; memset(&local, 0, sizeof(local)); local.sin6_family = AF_INET6; local.sin6_port = htons(LOCAL_PORT); local.sin6_addr = in6addr_any; bind(sock, (struct sockaddr*)&local, sizeof(local)); struct sockaddr_in6 peer; memset(&peer, 0, sizeof(peer)); peer.sin6_family = AF_INET6; peer.sin6_port = htons(PEER_PORT); inet_pton(AF_INET6, argv[1], &peer.sin6_addr); int timeout = TIMEOUT_MS; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); uint8_t seq = 0; char input[DATA_LEN]; while (1) { printf("You: "); fflush(stdout); fgets(input, sizeof(input), stdin); packet_t pkt = {0}; pkt.type = TYPE_DATA; pkt.seq = seq; pkt.length = strlen(input); memcpy(pkt.data, input, pkt.length); while (1) { sendto(sock, (char*)&pkt, sizeof(pkt), 0, (struct sockaddr*)&peer, sizeof(peer)); packet_t ack; struct sockaddr_in6 from; int fromlen = sizeof(from); int n = recvfrom(sock, (char*)&ack, sizeof(ack), 0, (struct sockaddr*)&from, &fromlen); if (n > 0 && ack.type == TYPE_ACK && ack.seq == seq) { break; } Sleep(TIMEOUT_MS); } seq ^= 1; } closesocket(sock); WSACleanup(); return 0; }