This commit is contained in:
2025-12-26 15:12:09 +08:00
parent 2ed3ffd5ca
commit 92fed4f21f
2 changed files with 28 additions and 12 deletions

View File

@@ -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;
}