📄 tcp_file_cli.c
字号:
/*
通用文件下载服务器,TCP实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <os_defs.h>
#include <os_socket.h>
#include <os_thread.h>
#include "tcp_file_defs.h"
void usage()
{
printf("tcp_file_cli port addr \n");
}
int main(int argc,char * argv[])
{
int port,ret;
unsigned long total_len,recv_len;
DL_FILE_HEADER file_hdr;
char buffer[1024];
FILE * file = NULL;
OS_SOCKET socket = INVALID_SOCKET;
if(argc<3)
{
usage();
ret = -1;
goto EXIT_CLIENT;
}
port = atoi(argv[1]);
if((port <= 1024 ) || (port >65000))
{
fprintf(stderr,"error port %s\n",argv[1]);
ret = -2;
goto EXIT_CLIENT;
}
OS_SocketInit();
{
unsigned long addr = OS_GetLocalAddr();
printf("local ip addr %s\n",inet_ntoa(*(struct in_addr *)&addr));}
if(OS_OpenTCPClient(&socket,argv[2],port)!=OS_OK)
{
fprintf(stderr,"connetct file server %s:%d failure \n",argv[2],port);
ret = -3;
goto EXIT_CLIENT;
}
/* 首先建立取一个结构*/
if((total_len = recv(socket,(char *)&file_hdr,sizeof(file_hdr),0))<sizeof(file_hdr))
{
fprintf(stderr,"recv file header failure ,code=%d\n",total_len);
ret = -4;
goto EXIT_CLIENT;
}
file_hdr.file_len = ntohl(file_hdr.file_len);
file_hdr.hdr_len = ntohl(file_hdr.hdr_len);
file_hdr.status = ntohl(file_hdr.status);
if((file_hdr.status != DL_FILE_SUCESS) ||(file_hdr.file_len <= 0))
{
fprintf(stderr,"download file failure ,%s",file_hdr.file_name);
ret = -5;
goto EXIT_CLIENT;
}
file = fopen(file_hdr.file_name,"wb+");
if(file == NULL)
{
fprintf(stderr,"create file %s failure\n",file_hdr.file_name);
ret = -6;
goto EXIT_CLIENT;
}
/* 开始下载文件*/
total_len = file_hdr.file_len;
while(total_len>0){
recv_len = recv(socket,buffer,sizeof(buffer),0);
if(recv_len <= 0)
{
ret = -7;
goto EXIT_CLIENT;
}
if(fwrite(buffer,1,recv_len,file)<recv_len)
{
ret = -8;
goto EXIT_CLIENT;
}
total_len -= recv_len;
}
ret = 0;
EXIT_CLIENT:
if(socket != INVALID_SOCKET)
OS_SocketClose(socket);
if(file)
fclose(file);
OS_SocketClear();
exit(ret);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -