From 92fed4f21f69bc8e25c4e8e6c0a35010c3a8f154 Mon Sep 17 00:00:00 2001 From: xinghen <2593026969@qq.com> Date: Fri, 26 Dec 2025 15:12:09 +0800 Subject: [PATCH] 1 --- linux_chat.c | 16 ++++++++++++---- windows_chat.c | 24 ++++++++++++++++-------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/linux_chat.c b/linux_chat.c index f2b7bb1..e35e11c 100644 --- a/linux_chat.c +++ b/linux_chat.c @@ -10,12 +10,12 @@ /* 停等协议发送(带超时重传) */ void send_with_stopwait(int sock, struct sockaddr_in6 *peer, - struct packet *pkt) + struct packet *pkt, int pkt_len) { socklen_t len = sizeof(*peer); while (1) { - sendto(sock, pkt, sizeof(*pkt), 0, + sendto(sock, pkt, pkt_len, 0, (struct sockaddr *)peer, len); fd_set fds; @@ -66,6 +66,9 @@ int main(int argc, char *argv[]) uint8_t recv_seq = 0; struct packet pkt, rcv; + memset(&pkt, 0, sizeof(pkt)); + memset(&rcv, 0, sizeof(rcv)); + printf("Linux UDP IPv6 Stop-Wait Chat\n"); while (1) { @@ -77,13 +80,14 @@ int main(int argc, char *argv[]) if (select(sock + 1, &fds, NULL, NULL, &tv) > 0) { recvfrom(sock, &rcv, sizeof(rcv), 0, NULL, NULL); + rcv.payload[sizeof(rcv.payload) - 1] = '\0'; if (rcv.type == TYPE_DATA) { if (rcv.seq == recv_seq) { printf("\npeer: %s\n", rcv.payload); recv_seq ^= 1; } rcv.type = TYPE_ACK; - sendto(sock, &rcv, sizeof(rcv), 0, + sendto(sock, &rcv, 2, 0, (struct sockaddr *)&peer, sizeof(peer)); } } @@ -93,10 +97,14 @@ int main(int argc, char *argv[]) if (!fgets(pkt.payload, sizeof(pkt.payload), stdin)) break; + size_t len = strlen(pkt.payload); + if (len > 0 && pkt.payload[len - 1] == '\n') pkt.payload[len - 1] = '\0'; + pkt.seq = send_seq; pkt.type = TYPE_DATA; - send_with_stopwait(sock, &peer, &pkt); + int pkt_len = 2 + strlen(pkt.payload) + 1; + send_with_stopwait(sock, &peer, &pkt, pkt_len); send_seq ^= 1; } diff --git a/windows_chat.c b/windows_chat.c index 3967cfc..c991470 100644 --- a/windows_chat.c +++ b/windows_chat.c @@ -9,13 +9,13 @@ void send_with_stopwait(SOCKET sock, struct sockaddr_in6 *peer, - struct packet *pkt) + struct packet *pkt, int pkt_len) { - int len = sizeof(*peer); + int addr_len = sizeof(*peer); while (1) { - sendto(sock, (char *)pkt, sizeof(*pkt), 0, - (struct sockaddr *)peer, len); + sendto(sock, (char *)pkt, pkt_len, 0, + (struct sockaddr *)peer, addr_len); fd_set fds; FD_ZERO(&fds); @@ -25,7 +25,7 @@ void send_with_stopwait(SOCKET sock, tv.tv_sec = TIMEOUT_SEC; tv.tv_usec = 0; - int ret = select(0, &fds, NULL, NULL, &tv); + int ret = select(sock + 1, &fds, NULL, NULL, &tv); if (ret > 0) { struct packet ack; recvfrom(sock, (char *)&ack, sizeof(ack), 0, NULL, NULL); @@ -64,6 +64,9 @@ int main(int argc, char *argv[]) uint8_t recv_seq = 0; struct packet pkt, rcv; + memset(&pkt, 0, sizeof(pkt)); + memset(&rcv, 0, sizeof(rcv)); + printf("Windows UDP IPv6 Stop-Wait Chat\n"); while (1) { @@ -72,15 +75,16 @@ int main(int argc, char *argv[]) FD_SET(sock, &fds); TIMEVAL tv = {0, 100000}; - if (select(0, &fds, NULL, NULL, &tv) > 0) { + if (select(sock + 1, &fds, NULL, NULL, &tv) > 0) { recvfrom(sock, (char *)&rcv, sizeof(rcv), 0, NULL, NULL); + rcv.payload[sizeof(rcv.payload) - 1] = '\0'; if (rcv.type == TYPE_DATA) { if (rcv.seq == recv_seq) { printf("\npeer: %s\n", rcv.payload); recv_seq ^= 1; } rcv.type = TYPE_ACK; - sendto(sock, (char *)&rcv, sizeof(rcv), 0, + sendto(sock, (char *)&rcv, 2, 0, (struct sockaddr *)&peer, sizeof(peer)); } } @@ -89,10 +93,14 @@ int main(int argc, char *argv[]) if (!fgets(pkt.payload, sizeof(pkt.payload), stdin)) break; + size_t len = strlen(pkt.payload); + if (len > 0 && pkt.payload[len - 1] == '\n') pkt.payload[len - 1] = '\0'; + pkt.seq = send_seq; pkt.type = TYPE_DATA; - send_with_stopwait(sock, &peer, &pkt); + int pkt_len = 2 + strlen(pkt.payload) + 1; + send_with_stopwait(sock, &peer, &pkt, pkt_len); send_seq ^= 1; }