#include #include #include #include #include #include #include #include "common.h" #define LOCAL_PORT 9000 #define PEER_PORT 9001 #define TIMEOUT_MS 500 int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s \n", argv[0]); return 1; } int sock = socket(AF_INET6, SOCK_DGRAM, 0); if (sock < 0) { perror("socket"); return 1; } struct sockaddr_in6 local = {0}; 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 = {0}; peer.sin6_family = AF_INET6; peer.sin6_port = htons(PEER_PORT); inet_pton(AF_INET6, argv[1], &peer.sin6_addr); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = TIMEOUT_MS * 1000; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 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, &pkt, sizeof(pkt), 0, (struct sockaddr*)&peer, sizeof(peer)); packet_t ack; struct sockaddr_in6 from; socklen_t fromlen = sizeof(from); int n = recvfrom(sock, &ack, sizeof(ack), 0, (struct sockaddr*)&from, &fromlen); if (n > 0 && ack.type == TYPE_ACK && ack.seq == seq) { break; } usleep(TIMEOUT_MS * 1000); } seq ^= 1; } close(sock); return 0; }