tcpip实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
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);
}