| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 328 人关注过本帖
标题:高分求助Linux文件传输问题!!!
只看楼主 加入收藏
chichaochao
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-12-28
结帖率:0
收藏
已结贴  问题点数:15 回复次数:2 
高分求助Linux文件传输问题!!!
服务器:
void recvMsg(){

 int sockfd,new_fd,serverip;/**/

 struct sockaddr_in server;/*server's address information*/

 struct sockaddr_in client;/*client's address information*/

 socklen_t sin_size;

 int num;/*the binary count of recieved message*/

 char recvmsg[MAXDATASIZE];/*buffer for recieve message*/

 char sendmsg[MAXDATASIZE];/*buffer for send message*/

 /*create a unbind socket*/

 if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){

 perror("Creating socket failed");

 exit(1);

 }

 bzero(&server,sizeof(server));/*set the server 0000*/

 /**

 *服务器端的信息

*/

 server.sin_family = AF_INET;

 server.sin_port = htons(atoi(port));

 if(strlen(ip)>0){

 inet_pton(AF_INET,ip,(void*)&serverip);

 server.sin_addr.s_addr = serverip;

 }

 else

 server.sin_addr.s_addr = htonl(INADDR_ANY);

 /*将socket绑定到本机*/

 if(bind(sockfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1){

 perror("Bind failed");

 exit(1);

 }

 if(listen(sockfd,10)==-1){

 perror("listen failed");

 }

sin_size = sizeof(struct sockaddr_in);

 while(1){

 if((new_fd = accept(sockfd,(struct sockaddr*)&client,&sin_size))==-1){

 perror("accept failed");

 }

 if(!fork()){

 bzero(&recvmsg,sizeof(recvmsg));

 if((num = recv(new_fd,recvmsg,sizeof(recvmsg),0))==-1){

 perror("recv failed");

 }

 recvmsg[num] = '\0';

 char **temp,*msg,*flag;

 temp = split(recvmsg,"-");

flag = temp[0];

 msg = temp[1];

 /*对客户端过来的各种指令进行处理*/

if(strcmp(flag,"login")==0){

 sprintf(sendmsg,"%d",checkLogin(msg));

 }

 if(strcmp(flag,"lmkdir")==0){

 sprintf(sendmsg,"%d",mkdr(msg));

 }

 if(strcmp(flag,"lrmdir")==0){

 sprintf(sendmsg,"%d",rmdr(msg));

 }

 if(strcmp(flag,"lpwd")==0){

 curdr(sendmsg);

 }

 if(strcmp(flag,"lcd")==0){

 chdr(msg,sendmsg);

 }

 if(strcmp(flag,"dir")==0){

 lsdr(sendmsg);

 }

 if(strcmp(flag,"put")==0){

 //get(new_fd,msg);

 puts("zxzx");

 char buffer[MAXDATASIZE];

 FILE *fp = fopen("/home/chichao/ftp/txt.txt","w+");

 if(NULL == fp ){

 perror("can not write");

 }

 else{

 bzero(buffer, MAXDATASIZE);

 int file_block_length = 0;

 while((file_block_length = recv(new_fd,buffer,sizeof(buffer),0))>0){

 int write_length = fwrite(buffer,sizeof(char),file_block_length,fp);

 bzero(buffer, MAXDATASIZE);

 }

 puts("endend");

 if(file_block_length<0){

 perror("recv data failed");

 }  

fclose(fp);

 }

 }

 sendmsg[strlen(sendmsg)] = '\0';

 if(send(new_fd,sendmsg,strlen(sendmsg),0)==-1){

 perror("send");

 }

 close(new_fd);

 }//



 }

 close(sockfd);/**/

}
客户端:
/*上传单个文件*/

void putf(){

 char filename[FILE_NAME_MAX_SIZE];

 char buffer[MAXDATASIZE];

 int serverip;

 int sockfd;/*socket*/

 struct sockaddr_in server;/*server's address information*/

 int num;/*the binary count of recieved message*/

 /*create a unbind socket*/

 if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){

 perror("Creating socket failed");

 exit(1);

 }

 /**

 *服务器端的信息

*/

 server.sin_family = AF_INET;

 server.sin_port = htons(atoi(port));

 inet_pton(AF_INET,ip,(void*)&serverip);   

server.sin_addr.s_addr = serverip;

   bzero(buffer, MAXDATASIZE);

   // 新建文件

 printf("please input filename>");

 gets(filename);

   FILE *fp = fopen(filename, "r");

   if (NULL == fp)

   {

   perror("can not read");

   }

 if(connect(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1){

 perror("connect failed");

 }

 //发送文件名和标志位

 sprintf(buffer,"%s-%s","put",filename);

 if((num=send(sockfd,buffer,strlen(buffer),0))==-1){

 perror("send flag failed");

 exit(1);

 }

 bzero(buffer, MAXDATASIZE);

 int file_block_length = 0;

 while((file_block_length = fread(buffer, sizeof(char), MAXDATASIZE, fp)) > 0){

 if((num = send(sockfd,buffer,MAXDATASIZE,0))>0){

 perror("send message failed");

 }

 printf("%d",num);

 buffer[num] = '\0';

 printf("%s",buffer);

 }

 printf("file: %s upload finished", filename);

 printf("\nmyftp>");

   fclose(fp);

 recv(sockfd,buffer,sizeof(buffer),0);

 printf("%s",buffer);

 close(sockfd);/**/

}
这是最核心的代码,一个很奇怪的问题是:文件名和标志为可以顺利发送,但是只有在客户端关闭退出的时候,才能将文件数据发送到服务器,这是什么问题?
搜索更多相关主题的帖子: 服务器 void message address server 
2012-05-20 09:27
小跳蚤
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:437
专家分:1623
注 册:2011-4-9
收藏
得分:8 
我是来看看分数有多高的
2012-05-20 10:07
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:8 
把accept放到while(1)外面试试
第一次接收文件名后,阻塞了

为游戏狂~~!!    大家努力编哈!
2012-05-20 10:27
快速回复:高分求助Linux文件传输问题!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044807 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved