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

View File

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