1
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user