i think yes these are the sockets im not sure about it ...but lets consider both assumption 1- if these are socket then how to implement it 2- if not then how to implement it
Main Topics
Browse All TopicsHi Experts
i need some modification in already made that works fine with no error:
I have the following code for sender.c
#include "assign1.h"
#include "sender.h"
extern int sTOr[2];
extern int rTOs[2];
FILE *fp;
static FRAME sendFrame;
void sender(char filename[]) {
short blockNum = 0;
char reply[5];
sigignore(SIGINT);
sendFrame.SOH = 00000001;
sendFrame.blockNum=0;
if ((fp = fopen(filename, "r")) == NULL) {
perror("receiver(): fopen: ");
exit(errno);
}
while ((readFile(sendFrame.msg))
++sendFrame.blockNum;
sendFrame.blockNumComp = ~sendFrame.blockNum;
sendFrame.checksum = makeChecksum(sendFrame.msg
printf("\nSENDER: blockNum = %d blockNumComp = %d checksum = %d\n", sendFrame.blockNum,
sendFrame.blockNumComp, sendFrame.checksum);
write(sTOr[1], &sendFrame, sizeof(FRAME));
while(1) {
read(rTOs[0], reply, sizeof("ACK"));
printf("%s was received\n", reply);
if (!strcmp(reply, "NAK")) {
printf("SENDER2: blockNum = %d blockNumComp = %d checksum = %d\n", sendFrame.blockNum,
sendFrame.blockNumComp, sendFrame.checksum);
write(sTOr[1], &sendFrame, sizeof(FRAME));
}
else if (!strcmp(reply, "ACK"))
break;
else
exit(12);
}
}
}
int readFile(char *str) {
int x;
for(x = 0; x < 128; x++)
str[x] = '\0';
return fread(str, sizeof(char), 128, fp);
}
and the following code for receiver.c
#include "assign1.h"
#include "receiver.h"
FRAME rFrame;
void receiver() {
sigset(SIGINT, makeError);
while (1) {
if (read(STDIN_FILENO, &rFrame, sizeof(FRAME)) > 0) {
sleep(1);
fprintf(stderr, "RECEIVER: blockNum = %d blockNumComp = %d checksum = %d\n", rFrame.blockNum,
rFrame.blockNumComp, rFrame.checksum);
if (!checkSOH(rFrame.SOH) ||
!checkBlockNum(rFrame.bloc
!checkChecksum(rFrame.msg,
write(STDOUT_FILENO, "NAK", sizeof("NAK"));
else
write(STDOUT_FILENO, "ACK", sizeof("ACK"));
}
}
}
int checkSOH(char SOH){
return (SOH == 00000001);
}
int checkBlockNum(const short blockNum, const short blockNumComp) {
short newComp = ~blockNum;
if (newComp == blockNumComp)
return 1; // No error
return 0; // Error
}
int checkChecksum(char *str, const short checksum) {
if (makeChecksum(str) == checksum)
return 1; // No error
return 0; // Error
}
void makeError() {
int n = rand()%3;
switch (n) {
case 0:
rFrame.blockNum = 0;
fputs("\nCHANGED BLOCK NUMBER\n", stderr);
break;
case 1:
rFrame.checksum = 0;
fputs("\nCHANGED CHECKSUM\n", stderr);
break;
case 2:
rFrame.blockNumComp = 10;
fputs("\nCHANGED BLOCK NUMBER COMPLIEMENT\n", stderr);
break;
}
}
The program simulates different errors that the protocol checks for.I need to modify the program so that it implements "time out".
Theory:
Sender: sends a frame and calls a SIGALRM function and sets the timer for say, 2 seconds. If the sender gets a response within two seconds from the receiver (either "ACK" or "NAK"), turn off the alarm and transmit the next frame. If no response is received, time out function kicks in and retransmits the frame.
Receiver: When it sees an error in transmission, do not send back anything to the sender and this causes the to time out and retransmit.
Im new to C language please help me solve my problem
regards
shaukat
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
>>>> 1- if these are socket then how to implement it
while(1) {
// Create the timeout struct
timeval tval;
fd_set set;
int rc;
FD_ZERO (&set);
FD_SET ((SOCKET)rTOs[0], &set);
// Call select
tval.tv_sec = 2;
tval.tv_usec = 0;
rc = SOCK_SELECT (rTOs[0]+ 1, &set, 0, 0, &tval);
if (rc < 0) {
// We had an error - go into error state
// m_state = SOCK_ERROR;
// return -1;
} else if (rc == 0) {
// We had a timeout
// return -2;
}
read(rTOs[0], reply, sizeof("ACK"));
printf("%s was received\n", reply);
So, the read only would be made if there is something to receive,i. e. it is not blocking.
2. if not then how to implement it
Hmmm, most probably you would need some kind of a timer. I think there is someone in the pthread library but actualy a read on a file never would block but return with EOF if come to end. So, it is a good chance that it is a socket (or at least a pipe)(though I don't know much of pipes either).
Regards, Alex
hmm lets talk little more about the code in detail.
where exactly im going to write this code.... i mean where do i append this code in my already existing code..........?
i think using timer is a good option as my prof. discuss the time out issue with timer. i saw only one thread with stop n wait protocol in previous thread liberary
Any suggesstion........?
thanks for your great help
forget about my previous question ...just help me fix this error. Im using the following code:
#include "assign1.h"
#include "sender.h"
extern int sTOr[2];
extern int rTOs[2];
FILE *fp;
static FRAME sendFrame;
void sender(char filename[]) {
short blockNum = 0;
char reply[5];
sigignore(SIGINT);
sendFrame.SOH = 00000001;
sendFrame.blockNum=0;
if ((fp = fopen(filename, "r")) == NULL) {
perror("receiver(): fopen: ");
exit(errno);
}
while ((readFile(sendFrame.msg))
++sendFrame.blockNum;
sendFrame.blockNumComp = ~sendFrame.blockNum;
sendFrame.checksum = makeChecksum(sendFrame.msg
printf("\nSENDER: blockNum = %d blockNumComp = %d checksum = %d\n", sendFrame.blockNum,
sendFrame.blockNumComp, sendFrame.checksum);
write(sTOr[1], &sendFrame, sizeof(FRAME));
while(1) {
read(rTOs[0], reply, sizeof("ACK"));
printf("%s was received\n", reply);
if (!strcmp(reply, "NAK")) {
printf("SENDER2: blockNum = %d blockNumComp = %d checksum = %d\n", sendFrame.blockNum,
sendFrame.blockNumComp, sendFrame.checksum);
write(sTOr[1], &sendFrame, sizeof(FRAME));
}
else if (!strcmp(reply, "ACK"))
break;
else
signal(SIGALRM, sender());
alarm(2);
}
}
}
int readFile(char *str) {
int x;
for(x = 0; x < 128; x++)
str[x] = '\0';
return fread(str, sizeof(char), 128, fp);
}
and it gives me the following error:
ender.c: In function `sender':
sender.c:46: too few arguments to function `sender'
sender.c:46: invalid use of void expression
and this error is on line : signal(SIGALRM, sender());
please help me fix this function call
best regards
shaukat
>>>> where exactly im going to write this code....
>>>> i mean where do i append this code in my
>>>> already existing code..........?
The code should be inserted between the 'while' and above the 'read'.
while(1) {
// here put the additional code I posted
...
read(rTOs[0], reply, sizeof("ACK"));
printf("%s was received\n", reply);
>>>> sender.c:46: warning: passing arg 2 of `signal' from incompatible pointer type
the signal function expects a function pointer of a function which prototype is 'void signalfunc(int)' while the sender has 'void sender(char*)'. Actually I don't know why you try to install the sender function as a signal handler. A signal handler was called in case of a signal event, e. g. when CTRL+c was pressed and the integer argument indicates the kind of event. The sender function is supposed to send a text message to a client or a server what hardly is the task of a signal handler.
Regards, Alex
Business Accounts
Answer for Membership
by: itsmeandnobodyelsePosted on 2007-09-20 at 08:38:10ID: 19929155
>>>> extern int sTOr[2];
>>>> extern int rTOs[2];
Are these sockets? If yes, you could realize a timeout by 'select' call which timeouts when there is no input on one or more sockets within a given time period.
Regards, Alex