tcpip实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《TCP/IP》实验报告

姓名:

学号:

学院:

专业:

班级:

指导老师:

2013年6月3日

实验一熟悉Linux编程环境

练习1:编写一个并发程序,利用fork函数创建五个进程,让每一个进程打印出可用来分辨不同进程的信息。

#include

#include

#include

int main()

{

int pid, i;

i = 0;

while(i < 5)

{

i++;

if((pid=fork()) == 0)

{

printf("pid:%d\n",getpid());

sleep(3);

break;

}

waitpid(pid,(int*)0,0);

printf("ppid:%d\n",getpid());

}

return 0;

}

运行结果:

练习2:编写一个程序,利用execve函数改变进程执行的代码。//execve.c

#include

#include

#include

int main(int argc,char *argv[])

{

char *newargv[] = {NULL,"you","me",NULL};

char *newenviron[]={NULL};

if(argc != 2)

{

fprintf(stderr,"Usage:%s \n",argv[0]);

exit(EXIT_FAILURE);

}

newargv[0] = argv[1];

execve(argv[1],newargv,newenviron);

perror("execve");

exit(EXIT_FAILURE);

}

//myecho.c

#include

#include

#include

int main(int argc, char *argv[])

{

int i;

for(i = 0; i < argc; i++)

printf("argv[%d]:%s\n",i,argv[i]);

return 0;

}

运行结果:

实验二实现Echo服务客户端程序(UDP)

代码:

//client.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int readable_timeo(int fd, int sec)

{

fd_set rset;

struct timeval tv;

FD_ZERO(&rset);

FD_SET(fd,&rset);

_sec = sec;

_usec = 0;

return (select(fd+1,&rset,NULL,NULL,&tv)); //使用select函数实现简单超时重传}

int main(int argc, char **argv)

{

int sockfd, len, res, i;

struct sockaddr_in address;

char *host;

struct hostent *hostinfo;

struct servent *servinfo;

char buf[128], buf2[128];

int nsec = 20;//timeout:20s

struct timeval tpstart,tpend;

double timeuse;

if(argc == 1)

host = "localhost";

else

host = argv[1];

hostinfo = gethostbyname(host);

if(!hostinfo)

{

fprintf(stderr,"no host:%s\n",host);

exit(1);

}

servinfo = getservbyname("echo","udp");

if(!servinfo)

{

fprintf(stderr,"no echo server!\n");

exit(1);

}

sockfd = socket(AF_INET,SOCK_DGRAM,0);

address.sin_family = AF_INET;

address.sin_port = servinfo->s_port;

address.sin_addr = *(struct in_addr*)*hostinfo->h_addr_list;

len = sizeof(address);

while(fgets(buf,128,stdin) != NULL)

{

for(i = 0; i < 2; i++) //juse one chance to resend

{

if(i == 1) //resend

{

printf("ReSend!!!\n");

gettimeofday(&tpend,NULL);

timeuse=1000000*(__sec)+__usec;

timeuse/=1000000;

printf("resend time is %lf s\n",timeuse);

}

gettimeofday(&tpstart,NULL);

res = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&address,len);

if(readable_timeo(sockfd,nsec) == 0)

{

fprintf(stderr,"socket timeout\n");

continue;

}

res = recvfrom(sockfd,buf2,128,0,(struct sockaddr*)&address,&len);

buf2[res] = 0;

fputs(buf2,stdout);

break; //send successfully,quit!

}

}

close(sockfd);

exit(0);

}

相关文档
最新文档