d(fd_file,snd_msg.s_buf,MSG_SIZE))>0)
{
snd_msg.s_len=read_n;//保存每次读取的长度
send(fd_client,&snd_msg,snd_msg.s_len+MSG_LEN,0);
}
snd_msg.s_len=0;
send(fd_client,&snd_msg,snd_msg.s_len+MSG_LEN,0);
close(fd_file);
close(fd_client);
}
return 0;
}
#include "mysocket.h"
int main(int argc,char *argv[])
{
if(argc!=3)
{
printf("too few argument!\n");
exit(-1);
}
MSG msg,rcv_msg;//一个用于发送文件名。一个用于接受文件
int fd_client,fd_file;
struct sockaddr_in sever_addr;//保存服务器端信息
if((fd_client=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(-1);
}
memset(&sever_addr,0,sizeof(sever_addr));
sever_addr.sin_family=AF_INET;
sever_addr.sin_port=htons(atoi(argv[2]));
sever_addr.sin_addr.s_addr=inet_addr(argv[1]);
//建立与服务器的连接
if(-1==connect(fd_client,(struct sockaddr *)&sever_addr,sizeof(sever_addr)))
{
perror("connect");
close(fd_client);
exit(-1);
}
//输入要下载的文件名
memset(&msg,0,sizeof(msg));
printf("input:");
scanf("%s",msg.s_buf);
fd_file=open(msg.s_buf,O_WRONLY|O_CREAT,0666);//创建对应的文件
msg.s_len=strlen(msg.s_buf);//发送文件名的长度
send(fd_client,&msg,msg.s_len+MSG_LEN,0);
//MSG_LEN表示int s_len的长度 msg.s_len存储的是文件名字符串的长度
int total;
while(1)
{
memset(&rcv_msg,0,sizeof(rcv_msg));//接受文件的结构体
recv(fd_client,&rcv_msg,MSG_LEN,0);//先接收字符串长度。存储在rcv_msg.s_len
total+=rcv_msg.s_len;
system("clear");
printf("downloading...%.2f kb\n",(double)total/1024);
if(rcv_msg.s_len>0)
{
recv(fd_client,rcv_msg.s_buf,rcv_msg.s_len,0);
write(fd_file,rcv_msg.s_buf,strlen(rcv_msg.s_buf));//写入文件中
}
else
{
break;
}
}
close(fd_file);
close(fd_client);
return 0;
}