Skip to content

Repository files navigation

IMPORTANT
All input.* and communicate.* files will be overwritten when we grade Lab 1.
Please refer to the website under the projects section for further instructions.
http://cseweb.ucsd.edu/classes/wi17/cse123-a/project.html
Program Description:
struct Frame_t
{
unsigned char sendId, recvId;
unsigned char seqNum, ackNum;
char flag;
char data[FRAME_PAYLOAD_SIZE];
unsigned char crc;
};
typedef struct Frame_t Frame;
Frame:
There are 7 fields in a frame with 64 bytes. The whole frame is 64 bytes long and payload size is 58 bytes. There are two unsigned char named sendId and recvId. They are used to store sender id and receiver id correspondingly. And another two unsigned char named seqNum and ackNum to store sequence number and acknowledge number. There's a char named flag. It is to indicate whether the frame is an ack or not. If the flag field is 1, then it is an ack, otherwise not. The data field is used to store payload and it is 58 bytes long. The last field is unsigned char used to store crc for error detecting.
struct Receiver_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_framelist_head
// 4) recv_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv;
LLnode * input_framelist_head;
int recv_id;
/* receiver side state: */
unsigned char NFE; /* seqno of next frame expected */
struct recvQ_slot {
bool received; /* is msg valid? */
Frame* msg;
} recvQ[8];
};
Receiver:
I add two new fields to receiver struct. NFE is an unsigned char used to store the next expected frame number. And recvQ is a buffer array. It has 8 recvQ_slot inside. Each recvQ_slot is a struct with a boolean and frame inside. The boolean is used to indicate whether the buffer has received this frame. And the frame field named msg is used to store the buffered frame. It is used to print out the received message to achieve accumulative purpose.
struct Sender_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_cmdlist_head
// 4) input_framelist_head
// 5) send_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv; LLnode * input_cmdlist_head;
LLnode * input_framelist_head;
int send_id;
/* sender side state: */
unsigned char LAR; /* seqno of last ACK received */
unsigned char LFS; /* last frame sent */
int seqCount; // sequence number counter
int sendWindowNotFull;
struct sendQ_slot {
struct timeval* timeout; /* event associated with send-timeout */
Frame* msg;
int used;
} sendQ[8];
};
Sender:
I add four useful fields to sender struct. There are two unsigned chars. LAR is to recore the sequence number of the last ACK received. LFS is the last frame sent. It can also used to initialize the frame sequence number. SendWindowNotFull is an int to indicate whether or not sliding window is full. It starts to be 8. When the window is full, this field decreases down to 0. And sendQ is a buffer array. It has 8 sendQ_slot inside. Each sendQ_slot is a struct with an int, a frame and a timeval object in it. The int is used to indicate whether the slot is being used. Frame msg is used to store the data and timeval is to calculate the time out.
Method Descriptions:
Receiver.c:
handle_incoming_msgs:
Dequeue the char array containing data from list, then convert it to frame. If the frame is not corrupted and frame is for that specific receiver, then store tqhe frame in buffer, if all the frames before has been received, just print out the message, otherwise wait for previous sequence number frames. Flip the flag from 0 to 1 and use the same frame as ack and send it back.
Sender.c:
handle_incoming_acks:
Dequeue the char array containing ack from the list, then convert it to frame. If the frame is not corrupted and it is for that specific sender, open the window for new frames in.
handle_input_cmds:
Dequeue the cmd from list and create a new frame via msg in cmd. If the msg is too big, then partition it. Check the window size to make sure there's still window available. Set the timeout object and then send to frame out.
handle_timeout_frames:
Check each frames at sending in the buffer, if it is overtime, resend the frame and reset the time.

About

Implementation of a packet-based data transmission protocol

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - rdeng/Sliding-Window-Protocol: Implementation of a packet-based data transmission protocol · GitHub
Skip to content

Repository files navigation

IMPORTANT
All input.* and communicate.* files will be overwritten when we grade Lab 1.
Please refer to the website under the projects section for further instructions.
http://cseweb.ucsd.edu/classes/wi17/cse123-a/project.html
Program Description:
struct Frame_t
{
unsigned char sendId, recvId;
unsigned char seqNum, ackNum;
char flag;
char data[FRAME_PAYLOAD_SIZE];
unsigned char crc;
};
typedef struct Frame_t Frame;
Frame:
There are 7 fields in a frame with 64 bytes. The whole frame is 64 bytes long and payload size is 58 bytes. There are two unsigned char named sendId and recvId. They are used to store sender id and receiver id correspondingly. And another two unsigned char named seqNum and ackNum to store sequence number and acknowledge number. There's a char named flag. It is to indicate whether the frame is an ack or not. If the flag field is 1, then it is an ack, otherwise not. The data field is used to store payload and it is 58 bytes long. The last field is unsigned char used to store crc for error detecting.
struct Receiver_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_framelist_head
// 4) recv_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv;
LLnode * input_framelist_head;
int recv_id;
/* receiver side state: */
unsigned char NFE; /* seqno of next frame expected */
struct recvQ_slot {
bool received; /* is msg valid? */
Frame* msg;
} recvQ[8];
};
Receiver:
I add two new fields to receiver struct. NFE is an unsigned char used to store the next expected frame number. And recvQ is a buffer array. It has 8 recvQ_slot inside. Each recvQ_slot is a struct with a boolean and frame inside. The boolean is used to indicate whether the buffer has received this frame. And the frame field named msg is used to store the buffered frame. It is used to print out the received message to achieve accumulative purpose.
struct Sender_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_cmdlist_head
// 4) input_framelist_head
// 5) send_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv; LLnode * input_cmdlist_head;
LLnode * input_framelist_head;
int send_id;
/* sender side state: */
unsigned char LAR; /* seqno of last ACK received */
unsigned char LFS; /* last frame sent */
int seqCount; // sequence number counter
int sendWindowNotFull;
struct sendQ_slot {
struct timeval* timeout; /* event associated with send-timeout */
Frame* msg;
int used;
} sendQ[8];
};
Sender:
I add four useful fields to sender struct. There are two unsigned chars. LAR is to recore the sequence number of the last ACK received. LFS is the last frame sent. It can also used to initialize the frame sequence number. SendWindowNotFull is an int to indicate whether or not sliding window is full. It starts to be 8. When the window is full, this field decreases down to 0. And sendQ is a buffer array. It has 8 sendQ_slot inside. Each sendQ_slot is a struct with an int, a frame and a timeval object in it. The int is used to indicate whether the slot is being used. Frame msg is used to store the data and timeval is to calculate the time out.
Method Descriptions:
Receiver.c:
handle_incoming_msgs:
Dequeue the char array containing data from list, then convert it to frame. If the frame is not corrupted and frame is for that specific receiver, then store tqhe frame in buffer, if all the frames before has been received, just print out the message, otherwise wait for previous sequence number frames. Flip the flag from 0 to 1 and use the same frame as ack and send it back.
Sender.c:
handle_incoming_acks:
Dequeue the char array containing ack from the list, then convert it to frame. If the frame is not corrupted and it is for that specific sender, open the window for new frames in.
handle_input_cmds:
Dequeue the cmd from list and create a new frame via msg in cmd. If the msg is too big, then partition it. Check the window size to make sure there's still window available. Set the timeout object and then send to frame out.
handle_timeout_frames:
Check each frames at sending in the buffer, if it is overtime, resend the frame and reset the time.

About

Implementation of a packet-based data transmission protocol

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - rdeng/Sliding-Window-Protocol: Implementation of a packet-based data transmission protocol · GitHub
Skip to content

Repository files navigation

IMPORTANT
All input.* and communicate.* files will be overwritten when we grade Lab 1.
Please refer to the website under the projects section for further instructions.
http://cseweb.ucsd.edu/classes/wi17/cse123-a/project.html
Program Description:
struct Frame_t
{
unsigned char sendId, recvId;
unsigned char seqNum, ackNum;
char flag;
char data[FRAME_PAYLOAD_SIZE];
unsigned char crc;
};
typedef struct Frame_t Frame;
Frame:
There are 7 fields in a frame with 64 bytes. The whole frame is 64 bytes long and payload size is 58 bytes. There are two unsigned char named sendId and recvId. They are used to store sender id and receiver id correspondingly. And another two unsigned char named seqNum and ackNum to store sequence number and acknowledge number. There's a char named flag. It is to indicate whether the frame is an ack or not. If the flag field is 1, then it is an ack, otherwise not. The data field is used to store payload and it is 58 bytes long. The last field is unsigned char used to store crc for error detecting.
struct Receiver_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_framelist_head
// 4) recv_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv;
LLnode * input_framelist_head;
int recv_id;
/* receiver side state: */
unsigned char NFE; /* seqno of next frame expected */
struct recvQ_slot {
bool received; /* is msg valid? */
Frame* msg;
} recvQ[8];
};
Receiver:
I add two new fields to receiver struct. NFE is an unsigned char used to store the next expected frame number. And recvQ is a buffer array. It has 8 recvQ_slot inside. Each recvQ_slot is a struct with a boolean and frame inside. The boolean is used to indicate whether the buffer has received this frame. And the frame field named msg is used to store the buffered frame. It is used to print out the received message to achieve accumulative purpose.
struct Sender_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_cmdlist_head
// 4) input_framelist_head
// 5) send_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv; LLnode * input_cmdlist_head;
LLnode * input_framelist_head;
int send_id;
/* sender side state: */
unsigned char LAR; /* seqno of last ACK received */
unsigned char LFS; /* last frame sent */
int seqCount; // sequence number counter
int sendWindowNotFull;
struct sendQ_slot {
struct timeval* timeout; /* event associated with send-timeout */
Frame* msg;
int used;
} sendQ[8];
};
Sender:
I add four useful fields to sender struct. There are two unsigned chars. LAR is to recore the sequence number of the last ACK received. LFS is the last frame sent. It can also used to initialize the frame sequence number. SendWindowNotFull is an int to indicate whether or not sliding window is full. It starts to be 8. When the window is full, this field decreases down to 0. And sendQ is a buffer array. It has 8 sendQ_slot inside. Each sendQ_slot is a struct with an int, a frame and a timeval object in it. The int is used to indicate whether the slot is being used. Frame msg is used to store the data and timeval is to calculate the time out.
Method Descriptions:
Receiver.c:
handle_incoming_msgs:
Dequeue the char array containing data from list, then convert it to frame. If the frame is not corrupted and frame is for that specific receiver, then store tqhe frame in buffer, if all the frames before has been received, just print out the message, otherwise wait for previous sequence number frames. Flip the flag from 0 to 1 and use the same frame as ack and send it back.
Sender.c:
handle_incoming_acks:
Dequeue the char array containing ack from the list, then convert it to frame. If the frame is not corrupted and it is for that specific sender, open the window for new frames in.
handle_input_cmds:
Dequeue the cmd from list and create a new frame via msg in cmd. If the msg is too big, then partition it. Check the window size to make sure there's still window available. Set the timeout object and then send to frame out.
handle_timeout_frames:
Check each frames at sending in the buffer, if it is overtime, resend the frame and reset the time.

About

Implementation of a packet-based data transmission protocol

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - rdeng/Sliding-Window-Protocol: Implementation of a packet-based data transmission protocol · GitHub
Skip to content

Repository files navigation

IMPORTANT
All input.* and communicate.* files will be overwritten when we grade Lab 1.
Please refer to the website under the projects section for further instructions.
http://cseweb.ucsd.edu/classes/wi17/cse123-a/project.html
Program Description:
struct Frame_t
{
unsigned char sendId, recvId;
unsigned char seqNum, ackNum;
char flag;
char data[FRAME_PAYLOAD_SIZE];
unsigned char crc;
};
typedef struct Frame_t Frame;
Frame:
There are 7 fields in a frame with 64 bytes. The whole frame is 64 bytes long and payload size is 58 bytes. There are two unsigned char named sendId and recvId. They are used to store sender id and receiver id correspondingly. And another two unsigned char named seqNum and ackNum to store sequence number and acknowledge number. There's a char named flag. It is to indicate whether the frame is an ack or not. If the flag field is 1, then it is an ack, otherwise not. The data field is used to store payload and it is 58 bytes long. The last field is unsigned char used to store crc for error detecting.
struct Receiver_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_framelist_head
// 4) recv_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv;
LLnode * input_framelist_head;
int recv_id;
/* receiver side state: */
unsigned char NFE; /* seqno of next frame expected */
struct recvQ_slot {
bool received; /* is msg valid? */
Frame* msg;
} recvQ[8];
};
Receiver:
I add two new fields to receiver struct. NFE is an unsigned char used to store the next expected frame number. And recvQ is a buffer array. It has 8 recvQ_slot inside. Each recvQ_slot is a struct with a boolean and frame inside. The boolean is used to indicate whether the buffer has received this frame. And the frame field named msg is used to store the buffered frame. It is used to print out the received message to achieve accumulative purpose.
struct Sender_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_cmdlist_head
// 4) input_framelist_head
// 5) send_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv; LLnode * input_cmdlist_head;
LLnode * input_framelist_head;
int send_id;
/* sender side state: */
unsigned char LAR; /* seqno of last ACK received */
unsigned char LFS; /* last frame sent */
int seqCount; // sequence number counter
int sendWindowNotFull;
struct sendQ_slot {
struct timeval* timeout; /* event associated with send-timeout */
Frame* msg;
int used;
} sendQ[8];
};
Sender:
I add four useful fields to sender struct. There are two unsigned chars. LAR is to recore the sequence number of the last ACK received. LFS is the last frame sent. It can also used to initialize the frame sequence number. SendWindowNotFull is an int to indicate whether or not sliding window is full. It starts to be 8. When the window is full, this field decreases down to 0. And sendQ is a buffer array. It has 8 sendQ_slot inside. Each sendQ_slot is a struct with an int, a frame and a timeval object in it. The int is used to indicate whether the slot is being used. Frame msg is used to store the data and timeval is to calculate the time out.
Method Descriptions:
Receiver.c:
handle_incoming_msgs:
Dequeue the char array containing data from list, then convert it to frame. If the frame is not corrupted and frame is for that specific receiver, then store tqhe frame in buffer, if all the frames before has been received, just print out the message, otherwise wait for previous sequence number frames. Flip the flag from 0 to 1 and use the same frame as ack and send it back.
Sender.c:
handle_incoming_acks:
Dequeue the char array containing ack from the list, then convert it to frame. If the frame is not corrupted and it is for that specific sender, open the window for new frames in.
handle_input_cmds:
Dequeue the cmd from list and create a new frame via msg in cmd. If the msg is too big, then partition it. Check the window size to make sure there's still window available. Set the timeout object and then send to frame out.
handle_timeout_frames:
Check each frames at sending in the buffer, if it is overtime, resend the frame and reset the time.

About

Implementation of a packet-based data transmission protocol

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - rdeng/Sliding-Window-Protocol: Implementation of a packet-based data transmission protocol · GitHub
Skip to content

Repository files navigation

IMPORTANT
All input.* and communicate.* files will be overwritten when we grade Lab 1.
Please refer to the website under the projects section for further instructions.
http://cseweb.ucsd.edu/classes/wi17/cse123-a/project.html
Program Description:
struct Frame_t
{
unsigned char sendId, recvId;
unsigned char seqNum, ackNum;
char flag;
char data[FRAME_PAYLOAD_SIZE];
unsigned char crc;
};
typedef struct Frame_t Frame;
Frame:
There are 7 fields in a frame with 64 bytes. The whole frame is 64 bytes long and payload size is 58 bytes. There are two unsigned char named sendId and recvId. They are used to store sender id and receiver id correspondingly. And another two unsigned char named seqNum and ackNum to store sequence number and acknowledge number. There's a char named flag. It is to indicate whether the frame is an ack or not. If the flag field is 1, then it is an ack, otherwise not. The data field is used to store payload and it is 58 bytes long. The last field is unsigned char used to store crc for error detecting.
struct Receiver_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_framelist_head
// 4) recv_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv;
LLnode * input_framelist_head;
int recv_id;
/* receiver side state: */
unsigned char NFE; /* seqno of next frame expected */
struct recvQ_slot {
bool received; /* is msg valid? */
Frame* msg;
} recvQ[8];
};
Receiver:
I add two new fields to receiver struct. NFE is an unsigned char used to store the next expected frame number. And recvQ is a buffer array. It has 8 recvQ_slot inside. Each recvQ_slot is a struct with a boolean and frame inside. The boolean is used to indicate whether the buffer has received this frame. And the frame field named msg is used to store the buffered frame. It is used to print out the received message to achieve accumulative purpose.
struct Sender_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_cmdlist_head
// 4) input_framelist_head
// 5) send_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv; LLnode * input_cmdlist_head;
LLnode * input_framelist_head;
int send_id;
/* sender side state: */
unsigned char LAR; /* seqno of last ACK received */
unsigned char LFS; /* last frame sent */
int seqCount; // sequence number counter
int sendWindowNotFull;
struct sendQ_slot {
struct timeval* timeout; /* event associated with send-timeout */
Frame* msg;
int used;
} sendQ[8];
};
Sender:
I add four useful fields to sender struct. There are two unsigned chars. LAR is to recore the sequence number of the last ACK received. LFS is the last frame sent. It can also used to initialize the frame sequence number. SendWindowNotFull is an int to indicate whether or not sliding window is full. It starts to be 8. When the window is full, this field decreases down to 0. And sendQ is a buffer array. It has 8 sendQ_slot inside. Each sendQ_slot is a struct with an int, a frame and a timeval object in it. The int is used to indicate whether the slot is being used. Frame msg is used to store the data and timeval is to calculate the time out.
Method Descriptions:
Receiver.c:
handle_incoming_msgs:
Dequeue the char array containing data from list, then convert it to frame. If the frame is not corrupted and frame is for that specific receiver, then store tqhe frame in buffer, if all the frames before has been received, just print out the message, otherwise wait for previous sequence number frames. Flip the flag from 0 to 1 and use the same frame as ack and send it back.
Sender.c:
handle_incoming_acks:
Dequeue the char array containing ack from the list, then convert it to frame. If the frame is not corrupted and it is for that specific sender, open the window for new frames in.
handle_input_cmds:
Dequeue the cmd from list and create a new frame via msg in cmd. If the msg is too big, then partition it. Check the window size to make sure there's still window available. Set the timeout object and then send to frame out.
handle_timeout_frames:
Check each frames at sending in the buffer, if it is overtime, resend the frame and reset the time.

About

Implementation of a packet-based data transmission protocol

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - rdeng/Sliding-Window-Protocol: Implementation of a packet-based data transmission protocol · GitHub
Skip to content

Repository files navigation

IMPORTANT
All input.* and communicate.* files will be overwritten when we grade Lab 1.
Please refer to the website under the projects section for further instructions.
http://cseweb.ucsd.edu/classes/wi17/cse123-a/project.html
Program Description:
struct Frame_t
{
unsigned char sendId, recvId;
unsigned char seqNum, ackNum;
char flag;
char data[FRAME_PAYLOAD_SIZE];
unsigned char crc;
};
typedef struct Frame_t Frame;
Frame:
There are 7 fields in a frame with 64 bytes. The whole frame is 64 bytes long and payload size is 58 bytes. There are two unsigned char named sendId and recvId. They are used to store sender id and receiver id correspondingly. And another two unsigned char named seqNum and ackNum to store sequence number and acknowledge number. There's a char named flag. It is to indicate whether the frame is an ack or not. If the flag field is 1, then it is an ack, otherwise not. The data field is used to store payload and it is 58 bytes long. The last field is unsigned char used to store crc for error detecting.
struct Receiver_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_framelist_head
// 4) recv_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv;
LLnode * input_framelist_head;
int recv_id;
/* receiver side state: */
unsigned char NFE; /* seqno of next frame expected */
struct recvQ_slot {
bool received; /* is msg valid? */
Frame* msg;
} recvQ[8];
};
Receiver:
I add two new fields to receiver struct. NFE is an unsigned char used to store the next expected frame number. And recvQ is a buffer array. It has 8 recvQ_slot inside. Each recvQ_slot is a struct with a boolean and frame inside. The boolean is used to indicate whether the buffer has received this frame. And the frame field named msg is used to store the buffered frame. It is used to print out the received message to achieve accumulative purpose.
struct Sender_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_cmdlist_head
// 4) input_framelist_head
// 5) send_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv; LLnode * input_cmdlist_head;
LLnode * input_framelist_head;
int send_id;
/* sender side state: */
unsigned char LAR; /* seqno of last ACK received */
unsigned char LFS; /* last frame sent */
int seqCount; // sequence number counter
int sendWindowNotFull;
struct sendQ_slot {
struct timeval* timeout; /* event associated with send-timeout */
Frame* msg;
int used;
} sendQ[8];
};
Sender:
I add four useful fields to sender struct. There are two unsigned chars. LAR is to recore the sequence number of the last ACK received. LFS is the last frame sent. It can also used to initialize the frame sequence number. SendWindowNotFull is an int to indicate whether or not sliding window is full. It starts to be 8. When the window is full, this field decreases down to 0. And sendQ is a buffer array. It has 8 sendQ_slot inside. Each sendQ_slot is a struct with an int, a frame and a timeval object in it. The int is used to indicate whether the slot is being used. Frame msg is used to store the data and timeval is to calculate the time out.
Method Descriptions:
Receiver.c:
handle_incoming_msgs:
Dequeue the char array containing data from list, then convert it to frame. If the frame is not corrupted and frame is for that specific receiver, then store tqhe frame in buffer, if all the frames before has been received, just print out the message, otherwise wait for previous sequence number frames. Flip the flag from 0 to 1 and use the same frame as ack and send it back.
Sender.c:
handle_incoming_acks:
Dequeue the char array containing ack from the list, then convert it to frame. If the frame is not corrupted and it is for that specific sender, open the window for new frames in.
handle_input_cmds:
Dequeue the cmd from list and create a new frame via msg in cmd. If the msg is too big, then partition it. Check the window size to make sure there's still window available. Set the timeout object and then send to frame out.
handle_timeout_frames:
Check each frames at sending in the buffer, if it is overtime, resend the frame and reset the time.

About

Implementation of a packet-based data transmission protocol

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - rdeng/Sliding-Window-Protocol: Implementation of a packet-based data transmission protocol · GitHub
Skip to content

Repository files navigation

IMPORTANT
All input.* and communicate.* files will be overwritten when we grade Lab 1.
Please refer to the website under the projects section for further instructions.
http://cseweb.ucsd.edu/classes/wi17/cse123-a/project.html
Program Description:
struct Frame_t
{
unsigned char sendId, recvId;
unsigned char seqNum, ackNum;
char flag;
char data[FRAME_PAYLOAD_SIZE];
unsigned char crc;
};
typedef struct Frame_t Frame;
Frame:
There are 7 fields in a frame with 64 bytes. The whole frame is 64 bytes long and payload size is 58 bytes. There are two unsigned char named sendId and recvId. They are used to store sender id and receiver id correspondingly. And another two unsigned char named seqNum and ackNum to store sequence number and acknowledge number. There's a char named flag. It is to indicate whether the frame is an ack or not. If the flag field is 1, then it is an ack, otherwise not. The data field is used to store payload and it is 58 bytes long. The last field is unsigned char used to store crc for error detecting.
struct Receiver_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_framelist_head
// 4) recv_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv;
LLnode * input_framelist_head;
int recv_id;
/* receiver side state: */
unsigned char NFE; /* seqno of next frame expected */
struct recvQ_slot {
bool received; /* is msg valid? */
Frame* msg;
} recvQ[8];
};
Receiver:
I add two new fields to receiver struct. NFE is an unsigned char used to store the next expected frame number. And recvQ is a buffer array. It has 8 recvQ_slot inside. Each recvQ_slot is a struct with a boolean and frame inside. The boolean is used to indicate whether the buffer has received this frame. And the frame field named msg is used to store the buffered frame. It is used to print out the received message to achieve accumulative purpose.
struct Sender_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_cmdlist_head
// 4) input_framelist_head
// 5) send_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv; LLnode * input_cmdlist_head;
LLnode * input_framelist_head;
int send_id;
/* sender side state: */
unsigned char LAR; /* seqno of last ACK received */
unsigned char LFS; /* last frame sent */
int seqCount; // sequence number counter
int sendWindowNotFull;
struct sendQ_slot {
struct timeval* timeout; /* event associated with send-timeout */
Frame* msg;
int used;
} sendQ[8];
};
Sender:
I add four useful fields to sender struct. There are two unsigned chars. LAR is to recore the sequence number of the last ACK received. LFS is the last frame sent. It can also used to initialize the frame sequence number. SendWindowNotFull is an int to indicate whether or not sliding window is full. It starts to be 8. When the window is full, this field decreases down to 0. And sendQ is a buffer array. It has 8 sendQ_slot inside. Each sendQ_slot is a struct with an int, a frame and a timeval object in it. The int is used to indicate whether the slot is being used. Frame msg is used to store the data and timeval is to calculate the time out.
Method Descriptions:
Receiver.c:
handle_incoming_msgs:
Dequeue the char array containing data from list, then convert it to frame. If the frame is not corrupted and frame is for that specific receiver, then store tqhe frame in buffer, if all the frames before has been received, just print out the message, otherwise wait for previous sequence number frames. Flip the flag from 0 to 1 and use the same frame as ack and send it back.
Sender.c:
handle_incoming_acks:
Dequeue the char array containing ack from the list, then convert it to frame. If the frame is not corrupted and it is for that specific sender, open the window for new frames in.
handle_input_cmds:
Dequeue the cmd from list and create a new frame via msg in cmd. If the msg is too big, then partition it. Check the window size to make sure there's still window available. Set the timeout object and then send to frame out.
handle_timeout_frames:
Check each frames at sending in the buffer, if it is overtime, resend the frame and reset the time.

About

Implementation of a packet-based data transmission protocol

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - rdeng/Sliding-Window-Protocol: Implementation of a packet-based data transmission protocol · GitHub
Skip to content

Repository files navigation

IMPORTANT
All input.* and communicate.* files will be overwritten when we grade Lab 1.
Please refer to the website under the projects section for further instructions.
http://cseweb.ucsd.edu/classes/wi17/cse123-a/project.html
Program Description:
struct Frame_t
{
unsigned char sendId, recvId;
unsigned char seqNum, ackNum;
char flag;
char data[FRAME_PAYLOAD_SIZE];
unsigned char crc;
};
typedef struct Frame_t Frame;
Frame:
There are 7 fields in a frame with 64 bytes. The whole frame is 64 bytes long and payload size is 58 bytes. There are two unsigned char named sendId and recvId. They are used to store sender id and receiver id correspondingly. And another two unsigned char named seqNum and ackNum to store sequence number and acknowledge number. There's a char named flag. It is to indicate whether the frame is an ack or not. If the flag field is 1, then it is an ack, otherwise not. The data field is used to store payload and it is 58 bytes long. The last field is unsigned char used to store crc for error detecting.
struct Receiver_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_framelist_head
// 4) recv_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv;
LLnode * input_framelist_head;
int recv_id;
/* receiver side state: */
unsigned char NFE; /* seqno of next frame expected */
struct recvQ_slot {
bool received; /* is msg valid? */
Frame* msg;
} recvQ[8];
};
Receiver:
I add two new fields to receiver struct. NFE is an unsigned char used to store the next expected frame number. And recvQ is a buffer array. It has 8 recvQ_slot inside. Each recvQ_slot is a struct with a boolean and frame inside. The boolean is used to indicate whether the buffer has received this frame. And the frame field named msg is used to store the buffered frame. It is used to print out the received message to achieve accumulative purpose.
struct Sender_t
{
//DO NOT CHANGE:
// 1) buffer_mutex
// 2) buffer_cv
// 3) input_cmdlist_head
// 4) input_framelist_head
// 5) send_id
pthread_mutex_t buffer_mutex;
pthread_cond_t buffer_cv; LLnode * input_cmdlist_head;
LLnode * input_framelist_head;
int send_id;
/* sender side state: */
unsigned char LAR; /* seqno of last ACK received */
unsigned char LFS; /* last frame sent */
int seqCount; // sequence number counter
int sendWindowNotFull;
struct sendQ_slot {
struct timeval* timeout; /* event associated with send-timeout */
Frame* msg;
int used;
} sendQ[8];
};
Sender:
I add four useful fields to sender struct. There are two unsigned chars. LAR is to recore the sequence number of the last ACK received. LFS is the last frame sent. It can also used to initialize the frame sequence number. SendWindowNotFull is an int to indicate whether or not sliding window is full. It starts to be 8. When the window is full, this field decreases down to 0. And sendQ is a buffer array. It has 8 sendQ_slot inside. Each sendQ_slot is a struct with an int, a frame and a timeval object in it. The int is used to indicate whether the slot is being used. Frame msg is used to store the data and timeval is to calculate the time out.
Method Descriptions:
Receiver.c:
handle_incoming_msgs:
Dequeue the char array containing data from list, then convert it to frame. If the frame is not corrupted and frame is for that specific receiver, then store tqhe frame in buffer, if all the frames before has been received, just print out the message, otherwise wait for previous sequence number frames. Flip the flag from 0 to 1 and use the same frame as ack and send it back.
Sender.c:
handle_incoming_acks:
Dequeue the char array containing ack from the list, then convert it to frame. If the frame is not corrupted and it is for that specific sender, open the window for new frames in.
handle_input_cmds:
Dequeue the cmd from list and create a new frame via msg in cmd. If the msg is too big, then partition it. Check the window size to make sure there's still window available. Set the timeout object and then send to frame out.
handle_timeout_frames:
Check each frames at sending in the buffer, if it is overtime, resend the frame and reset the time.

About

Implementation of a packet-based data transmission protocol

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages