当前位置: 技术问答>linux和unix
第2个问题,还是网络,select()用法,到底哪里错了呢?
来源: 互联网 发布时间:2016-07-12
本文导语: RT,还是传送文件的问题。服务器端读取文件"test.txt"发送到客户端,客户端接收文件后保存到"Test.txt"文件中。下面是服务器端和客户端连接成功以后的程序,大家帮忙检查下。运行结果不出来。 服务器端 while(1) ...
RT,还是传送文件的问题。服务器端读取文件"test.txt"发送到客户端,客户端接收文件后保存到"Test.txt"文件中。下面是服务器端和客户端连接成功以后的程序,大家帮忙检查下。运行结果不出来。
服务器端
while(1)
{
/* 服务器阻塞,直到客户程序建立连接 */
len=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr*)&client_addr,&len))==-1)
{
fprintf(stderr,"Accept error:%sna",strerror(errno));
exit(1);
}
/* 自己处理函数 */
fp=fopen("test.txt","r+");
if(fp==NULL) { printf("Fopen error."); exit(1);}
while(fread(buffer,1,1,fp)!=EOF)
{
if((send(new_fd,buffer,strlen(buffer),0))==-1)
{ printf("Send error."); exit(1); }
memset(buffer,0,strlen(buffer));
}
close(new_fd);
close(fp);
}
close(sockfd);
exit(0);
客户端程序
/*连接成功*/
printf("n准备读取文件n");
while(1)
{
/*把集合清空*/
FD_ZERO(&readfds);
/*把标准输入句柄0加入到集合中*/
FD_SET(0,&readfds);
maxfd=0;
/*把当前句柄sockfd加入到集合中*/
FD_SET(sockfd,&readfds);
if(sockfd>maxfd)
maxfd=sockfd;
/*设置最大等待时间*/
tv.tv_sec=1;
tv.tv_usec=0;
/*开始等待*/
retval=select(maxfd+1,&readfds,NULL,NULL,&tv);
if(retval==-1)
{
printf("将退出,select出错!%s",strerror(errno));
break;
}
else
if(retval==0)
{
/*如果超时,返回0,让它继续等*/
continue;
}
else
{
if(FD_ISSET(sockfd,&readfds))
bzero(buffer,MAXBUF+1);
/*接收到的字符长度*/
len=recv(sockfd,buffer,MAXBUF,0);
if(len>0)
{
fp2=fopen("Test.txt","a+");
fwrite(buffer,1,strlen(buffer),fp2);
}
else
{
if(len
服务器端
while(1)
{
/* 服务器阻塞,直到客户程序建立连接 */
len=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr*)&client_addr,&len))==-1)
{
fprintf(stderr,"Accept error:%sna",strerror(errno));
exit(1);
}
/* 自己处理函数 */
fp=fopen("test.txt","r+");
if(fp==NULL) { printf("Fopen error."); exit(1);}
while(fread(buffer,1,1,fp)!=EOF)
{
if((send(new_fd,buffer,strlen(buffer),0))==-1)
{ printf("Send error."); exit(1); }
memset(buffer,0,strlen(buffer));
}
close(new_fd);
close(fp);
}
close(sockfd);
exit(0);
客户端程序
/*连接成功*/
printf("n准备读取文件n");
while(1)
{
/*把集合清空*/
FD_ZERO(&readfds);
/*把标准输入句柄0加入到集合中*/
FD_SET(0,&readfds);
maxfd=0;
/*把当前句柄sockfd加入到集合中*/
FD_SET(sockfd,&readfds);
if(sockfd>maxfd)
maxfd=sockfd;
/*设置最大等待时间*/
tv.tv_sec=1;
tv.tv_usec=0;
/*开始等待*/
retval=select(maxfd+1,&readfds,NULL,NULL,&tv);
if(retval==-1)
{
printf("将退出,select出错!%s",strerror(errno));
break;
}
else
if(retval==0)
{
/*如果超时,返回0,让它继续等*/
continue;
}
else
{
if(FD_ISSET(sockfd,&readfds))
bzero(buffer,MAXBUF+1);
/*接收到的字符长度*/
len=recv(sockfd,buffer,MAXBUF,0);
if(len>0)
{
fp2=fopen("Test.txt","a+");
fwrite(buffer,1,strlen(buffer),fp2);
}
else
{
if(len