-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsample.c
97 lines (87 loc) · 1.86 KB
/
sample.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
* sample source
*/
#include <stdio.h>
#include "transport.h"
#define DATASIZE 1024
#define PKTTYPE_DATA 1
struct pkt {
unsigned short pkt_type; /* data or ack */
unsigned short pkt_len; /* payload length */
unsigned int pkt_seqnum; /* sequence number */
char pkt_data[DATASIZE]; /* data area */
};
#define HEADERLEN (sizeof(struct pkt) - DATASIZE)
static int elapsed_time = 0; /* elapsed time (ms) */
/* incremented in 10ms interval */
/*
* void
* sender(int window, int tmeout)
* int window: window size (not used in this sample)
* int timeout: timeout value (not used in this sample)
*/
void
sender(int window, int timeout)
{
int cnt, ret;
struct pkt packet;
#ifdef DEBUG
int txseq = 0;
#endif
packet.pkt_type = PKTTYPE_DATA;
while ((cnt = get_data(packet.pkt_data, DATASIZE)) != NET_EOF) {
#ifdef DEBUG
packet.pkt_seqnum = txseq++;
packet.pkt_len = cnt;
#endif
if ((ret = udt_send(&packet, cnt+HEADERLEN)) != NET_SUCCESS) {
switch (ret) {
case NET_TOOBIG:
fprintf(stderr, "sender: NET_TOOBIG\n");
exit(1);
case NET_SYSERR:
fprintf(stderr, "sender: NET_SYSERR\n");
exit(1);
default:
fprintf(stderr, "sender: unknown\n");
exit(1);
}
}
}
}
/*
* void
* receiver()
*/
void
receiver()
{
int cnt;
static int rxseq = 0;
struct pkt packet;
while ((cnt = udt_recv(&packet, sizeof packet, -1)) != NET_EOF) {
if (cnt == 0)
continue;
else if (cnt == NET_SYSERR) {
fprintf(stderr, "receiver: NET_SYSERR\n");
exit(1);
} else if (cnt < 0) {
fprintf(stderr, "receiver: unknown error\n");
exit(1);
}
if (rxseq < packet.pkt_seqnum) {
printf("lost:");
while (rxseq < packet.pkt_seqnum)
printf(" %d", rxseq++);
printf("\n");
}
rxseq = packet.pkt_seqnum + 1;
deliver_data(packet.pkt_data, packet.pkt_len);
}
}
/* called by timer per 10ms */
void
timer_handler()
{
elapsed_time += 10;
}