From ae50f15afed9d02d3cf3a46fc108624f592a0420 Mon Sep 17 00:00:00 2001 From: xinghenLuyus <2593026969@qq.com> Date: Fri, 26 Dec 2025 15:00:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20windows=5Fchat.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- windows_chat.c | 83 +++++++++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/windows_chat.c b/windows_chat.c index 531e6c3..e8dd391 100644 --- a/windows_chat.c +++ b/windows_chat.c @@ -10,7 +10,7 @@ #define LOCAL_PORT 9001 #define PEER_PORT 9000 -#define TIMEOUT_MS 500 +#define TIMEOUT_MS 200 int main(int argc, char *argv[]) { if (argc != 2) { @@ -23,16 +23,13 @@ int main(int argc, char *argv[]) { SOCKET sock = socket(AF_INET6, SOCK_DGRAM, 0); - struct sockaddr_in6 local; - memset(&local, 0, sizeof(local)); + 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; - memset(&peer, 0, sizeof(peer)); + 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); @@ -41,42 +38,60 @@ int main(int argc, char *argv[]) { setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); - uint8_t seq = 0; - char input[DATA_LEN]; + uint8_t send_seq = 0; + uint8_t waiting_ack = 0; + packet_t last_pkt; while (1) { - printf("You: "); - fflush(stdout); - fgets(input, sizeof(input), stdin); + /* 尝试接收 */ + packet_t pkt; + struct sockaddr_in6 from; + int fromlen = sizeof(from); - packet_t pkt = {0}; - pkt.type = TYPE_DATA; - pkt.seq = seq; - pkt.length = strlen(input); - memcpy(pkt.data, input, pkt.length); + int n = recvfrom(sock, (char*)&pkt, sizeof(pkt), 0, + (struct sockaddr*)&from, &fromlen); - while (1) { - sendto(sock, (char*)&pkt, sizeof(pkt), 0, - (struct sockaddr*)&peer, sizeof(peer)); + if (n > 0) { + if (pkt.type == TYPE_DATA) { + printf("\nPeer: %s", pkt.data); - packet_t ack; - struct sockaddr_in6 from; - int fromlen = sizeof(from); + packet_t ack = {0}; + ack.type = TYPE_ACK; + ack.seq = pkt.seq; - int n = recvfrom(sock, (char*)&ack, sizeof(ack), 0, - (struct sockaddr*)&from, &fromlen); - - if (n > 0 && ack.type == TYPE_ACK && ack.seq == seq) { - break; + sendto(sock, (char*)&ack, sizeof(ack), 0, + (struct sockaddr*)&peer, sizeof(peer)); + } + else if (pkt.type == TYPE_ACK && + waiting_ack && pkt.seq == send_seq) { + waiting_ack = 0; + send_seq ^= 1; } - - Sleep(TIMEOUT_MS); } - seq ^= 1; - } + /* 如果不在等 ACK,允许发送 */ + if (!waiting_ack) { + char buf[DATA_LEN]; + printf("You: "); + fflush(stdout); - closesocket(sock); - WSACleanup(); - return 0; + if (fgets(buf, sizeof(buf), stdin) == NULL) + continue; + + memset(&last_pkt, 0, sizeof(last_pkt)); + last_pkt.type = TYPE_DATA; + last_pkt.seq = send_seq; + last_pkt.length = strlen(buf); + memcpy(last_pkt.data, buf, last_pkt.length); + + sendto(sock, (char*)&last_pkt, sizeof(last_pkt), 0, + (struct sockaddr*)&peer, sizeof(peer)); + + waiting_ack = 1; + } else { + sendto(sock, (char*)&last_pkt, sizeof(last_pkt), 0, + (struct sockaddr*)&peer, sizeof(peer)); + Sleep(TIMEOUT_MS); + } + } }