📄 test3.c
字号:
// Netprog 2002 HW1 submission test program// This code tests layer 4//#include <stdio.h>#include <stdlib.h>#include <unistd.h> // read() and write() prototypes are here//------------------------------------------------------------------// Sample layer 1 implementation based on a unix pipe.//int readfd,writefd;int generror=0;int writecount=0;void init_l1(void) { static int first=1; int fds[2]; if (! first) { close(readfd); close(writefd); } else { first=0; } writecount=0; if (pipe(fds)==-1) { printf("ERROR: Can't create pipe \n"); exit(1); } readfd = fds[0]; writefd = fds[1];}// sample l1_read just calls read on stdinint l1_read( char *b) { if (generror==1) { return(-1); } else { if (read(readfd,b,1)!=1) return(-1); else return(1); }}// sample l1_write just calls write to stdoutint l1_write(char b) { writecount++; if (generror==2) { return(-1); } else { if ((generror==3) && (writecount==10)) { // modify only the 10th byte // (aiming for the middle of the message) b++; } if (write(writefd,&b,1)!=1) return(-1); else return(1); }}// Sample layer 2int l2_read(char *s, int max) { int i; char buf[10]; int len; // read the length as 3 ASCII digits for (i=0;i<3;i++) { if (l1_read(buf+i)==-1) { return(-1); } } //convert string to int buf[3]=0; len = atoi(buf); // make sure the message is not too large if (len>max) { return(-1); } // now read that many bytes for (i=0;i<len;i++) { if (l1_read(s+i)==-1) { return(-1); } } // everything seems OK return(len);}int l2_write(char *s, int n) { int i; char buf[10]; if ((n>999)||(n<0)) return(-1); // first send the length as 3 ASCII digits sprintf(buf,"%03d",n); for (i=0;i<3;i++) { if (l1_write(buf[i])!=1) { return(-1); } } // now send the buffer for (i=0;i<n;i++) { if (l1_write(s[i])!=1) { return(-1); } } // everything seems fine - return n return(n);} //------------------------------------------------------------------// layer3 prototypesint l3_write(char *, int);int l3_read(char *, int);int main(int argc,char **argv) { char buf[4000]; char inbuf[4000]; int len; int err=0; int i; init_l1(); printf("l3 test 1 (sending ints): "); for (i=0;i<1000;i++) { if (l3_write((char *) &i, sizeof(int) )==-1) { printf("l3_write error\n"); err=1; break; } if ( (len=l3_read(buf,100))==-1) { printf("l3_read error\n"); err=1; break; } if (len!=sizeof(int)) { printf("l3_read returns wrong length\n"); err=1;break; } if (*((int *)buf) != i) { printf("l3_read value is wrong\n"); err=1;break; } } if (! err) printf("OK\n"); init_l1(); err=0; for (i=0;i<3000;i++) buf[i]=i%256; printf("l3 length test 800: "); len=l3_write(buf,800); if (len==-1) { printf("l3_write error\n"); err=1; } else { if (len != 800) { printf("l3_write returned wrong count\n"); err=1; } else { if ( (len=l3_read(inbuf,2000))==-1) { printf("l3_read error\n"); err=1; } else { if (len!=800) { printf("l3_read returns wrong length\n"); err=1; } else { for (i=0;i<800;i++) { if (inbuf[i] != (char)(i%256)) { printf("l3_read value is wrong\n"); err=1;break; } } } } } } if (! err) printf("OK\n"); init_l1(); err=0; printf("l3 length test 1000: "); len=l3_write(buf,1000); if (len==-1) { printf("OK\n"); } else { printf("Allows 1000 (should not)\n"); } printf("l3 forced read error: "); init_l1(); generror=1; if ( (len=l3_read(buf,100))==-1) { printf("OK\n"); } else { printf("doesn't return error (it should!)\n"); } printf("l3 forced write error: "); init_l1(); generror=2; if ( (len=l3_write(buf,100))==-1) { printf("OK\n"); } else { printf("doesn't return error (it should!)\n"); } init_l1(); err=0; generror=3; printf("l3 transmission error test: "); len=l3_write(buf,30); if (len==-1) { printf("l3_write error\n"); err=1; } else { if (len != 30) { printf("l3_write returned wrong count\n"); err=1; } else { if ( (len=l3_read(inbuf,2000))==-1) { printf("OK\n"); } else { printf("Didn't find the problem\n"); } } } return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -