1
This commit is contained in:
16
linux_chat.c
16
linux_chat.c
@@ -10,12 +10,12 @@
|
|||||||
/* 停等协议发送(带超时重传) */
|
/* 停等协议发送(带超时重传) */
|
||||||
void send_with_stopwait(int sock,
|
void send_with_stopwait(int sock,
|
||||||
struct sockaddr_in6 *peer,
|
struct sockaddr_in6 *peer,
|
||||||
struct packet *pkt)
|
struct packet *pkt, int pkt_len)
|
||||||
{
|
{
|
||||||
socklen_t len = sizeof(*peer);
|
socklen_t len = sizeof(*peer);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
sendto(sock, pkt, sizeof(*pkt), 0,
|
sendto(sock, pkt, pkt_len, 0,
|
||||||
(struct sockaddr *)peer, len);
|
(struct sockaddr *)peer, len);
|
||||||
|
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
@@ -66,6 +66,9 @@ int main(int argc, char *argv[])
|
|||||||
uint8_t recv_seq = 0;
|
uint8_t recv_seq = 0;
|
||||||
struct packet pkt, rcv;
|
struct packet pkt, rcv;
|
||||||
|
|
||||||
|
memset(&pkt, 0, sizeof(pkt));
|
||||||
|
memset(&rcv, 0, sizeof(rcv));
|
||||||
|
|
||||||
printf("Linux UDP IPv6 Stop-Wait Chat\n");
|
printf("Linux UDP IPv6 Stop-Wait Chat\n");
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -77,13 +80,14 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (select(sock + 1, &fds, NULL, NULL, &tv) > 0) {
|
if (select(sock + 1, &fds, NULL, NULL, &tv) > 0) {
|
||||||
recvfrom(sock, &rcv, sizeof(rcv), 0, NULL, NULL);
|
recvfrom(sock, &rcv, sizeof(rcv), 0, NULL, NULL);
|
||||||
|
rcv.payload[sizeof(rcv.payload) - 1] = '\0';
|
||||||
if (rcv.type == TYPE_DATA) {
|
if (rcv.type == TYPE_DATA) {
|
||||||
if (rcv.seq == recv_seq) {
|
if (rcv.seq == recv_seq) {
|
||||||
printf("\npeer: %s\n", rcv.payload);
|
printf("\npeer: %s\n", rcv.payload);
|
||||||
recv_seq ^= 1;
|
recv_seq ^= 1;
|
||||||
}
|
}
|
||||||
rcv.type = TYPE_ACK;
|
rcv.type = TYPE_ACK;
|
||||||
sendto(sock, &rcv, sizeof(rcv), 0,
|
sendto(sock, &rcv, 2, 0,
|
||||||
(struct sockaddr *)&peer, sizeof(peer));
|
(struct sockaddr *)&peer, sizeof(peer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,10 +97,14 @@ int main(int argc, char *argv[])
|
|||||||
if (!fgets(pkt.payload, sizeof(pkt.payload), stdin))
|
if (!fgets(pkt.payload, sizeof(pkt.payload), stdin))
|
||||||
break;
|
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.seq = send_seq;
|
||||||
pkt.type = TYPE_DATA;
|
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;
|
send_seq ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,13 +9,13 @@
|
|||||||
|
|
||||||
void send_with_stopwait(SOCKET sock,
|
void send_with_stopwait(SOCKET sock,
|
||||||
struct sockaddr_in6 *peer,
|
struct sockaddr_in6 *peer,
|
||||||
struct packet *pkt)
|
struct packet *pkt, int pkt_len)
|
||||||
{
|
{
|
||||||
int len = sizeof(*peer);
|
int addr_len = sizeof(*peer);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
sendto(sock, (char *)pkt, sizeof(*pkt), 0,
|
sendto(sock, (char *)pkt, pkt_len, 0,
|
||||||
(struct sockaddr *)peer, len);
|
(struct sockaddr *)peer, addr_len);
|
||||||
|
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
@@ -25,7 +25,7 @@ void send_with_stopwait(SOCKET sock,
|
|||||||
tv.tv_sec = TIMEOUT_SEC;
|
tv.tv_sec = TIMEOUT_SEC;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
int ret = select(0, &fds, NULL, NULL, &tv);
|
int ret = select(sock + 1, &fds, NULL, NULL, &tv);
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
struct packet ack;
|
struct packet ack;
|
||||||
recvfrom(sock, (char *)&ack, sizeof(ack), 0, NULL, NULL);
|
recvfrom(sock, (char *)&ack, sizeof(ack), 0, NULL, NULL);
|
||||||
@@ -64,6 +64,9 @@ int main(int argc, char *argv[])
|
|||||||
uint8_t recv_seq = 0;
|
uint8_t recv_seq = 0;
|
||||||
struct packet pkt, rcv;
|
struct packet pkt, rcv;
|
||||||
|
|
||||||
|
memset(&pkt, 0, sizeof(pkt));
|
||||||
|
memset(&rcv, 0, sizeof(rcv));
|
||||||
|
|
||||||
printf("Windows UDP IPv6 Stop-Wait Chat\n");
|
printf("Windows UDP IPv6 Stop-Wait Chat\n");
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -72,15 +75,16 @@ int main(int argc, char *argv[])
|
|||||||
FD_SET(sock, &fds);
|
FD_SET(sock, &fds);
|
||||||
TIMEVAL tv = {0, 100000};
|
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);
|
recvfrom(sock, (char *)&rcv, sizeof(rcv), 0, NULL, NULL);
|
||||||
|
rcv.payload[sizeof(rcv.payload) - 1] = '\0';
|
||||||
if (rcv.type == TYPE_DATA) {
|
if (rcv.type == TYPE_DATA) {
|
||||||
if (rcv.seq == recv_seq) {
|
if (rcv.seq == recv_seq) {
|
||||||
printf("\npeer: %s\n", rcv.payload);
|
printf("\npeer: %s\n", rcv.payload);
|
||||||
recv_seq ^= 1;
|
recv_seq ^= 1;
|
||||||
}
|
}
|
||||||
rcv.type = TYPE_ACK;
|
rcv.type = TYPE_ACK;
|
||||||
sendto(sock, (char *)&rcv, sizeof(rcv), 0,
|
sendto(sock, (char *)&rcv, 2, 0,
|
||||||
(struct sockaddr *)&peer, sizeof(peer));
|
(struct sockaddr *)&peer, sizeof(peer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,10 +93,14 @@ int main(int argc, char *argv[])
|
|||||||
if (!fgets(pkt.payload, sizeof(pkt.payload), stdin))
|
if (!fgets(pkt.payload, sizeof(pkt.payload), stdin))
|
||||||
break;
|
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.seq = send_seq;
|
||||||
pkt.type = TYPE_DATA;
|
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;
|
send_seq ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user