📄 tcp_file_svr.c
字号:
/*
通用文件下载服务器,TCP实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <os_socket.h>
#include <os_thread.h>
#include "tcp_file_defs.h"
int handle_file_download(OS_SOCKET socket,char * filename);
void usage()
{
printf("tcp_file_svr port filepath\n");
}
int main(int argc,char * argv[])
{
int port;
OS_SOCKET socket = INVALID_SOCKET;
if(argc<3)
{
usage();
exit(-1);
}
port = atoi(argv[1]);
if((port <= 1024 ) || (port >65000))
{
fprintf(stderr,"error port %s\n",argv[1]);
exit(-2);
}
OS_SocketInit();
if(OS_OpenTCPServer(&socket, port)!=OS_OK)
{
fprintf(stderr,"create tcp file server failure on %d\n",port);
exit(-3);
}
printf("server waiting on port %d,file is %s...\n",port,argv[2]);
handle_file_download(socket,argv[2]);
OS_SocketClose(socket);
OS_SocketClear();
}
char * g_file_name = NULL;
unsigned long g_file_len = 0;
/* 线程执行函数*/
static void * thread_download_func(void * arg)
{
DL_FILE_HEADER file_hdr;
OS_SOCKET client_sock =(OS_SOCKET)arg;
FILE * file = NULL;
char buff[1024];
int len ;
printf("begin send\n");
file = fopen(g_file_name,"rb");
if(file ==NULL)
{
goto EXIT_THREAD;
}
/* 取得文件长度*/
if(g_file_len == 0)
{
fseek(file,0,SEEK_END);
g_file_len = ftell(file);
fseek(file,0,SEEK_SET);
}
file_hdr.hdr_len = htonl(sizeof(file_hdr));
file_hdr.file_len = htonl(g_file_len);
file_hdr.status = htonl(DL_FILE_SUCESS);
strncpy(file_hdr.file_name,g_file_name,sizeof(file_hdr.file_name)-1);
/*先发送文件信息到客户端 */
if(send(client_sock,(struct sockaddr *)&file_hdr,sizeof(file_hdr),0)==SOCKET_ERROR)
{
goto EXIT_THREAD;
}
/* 打开文件,将文件依次发送完毕*/
while(1)
{
len =fread(buff,1,sizeof(buff),file);
if(len<= 0)
break;
if(send(client_sock,buff,len,0)< 0)
{
goto EXIT_THREAD;
}
}
EXIT_THREAD:
if(file)
fclose(file);
OS_SocketClose(client_sock);
return NULL;
}
int handle_file_download(OS_SOCKET socket,char * filename)
{
struct sockaddr_in client_addr;
int addr_size ;
OS_SOCKET new_sock;
OS_THREAD_T thread_id;
addr_size = sizeof(struct sockaddr_in);
g_file_name = filename;
while(1) {
//如果有客户端建立连接,将产生一个全新的套接字 new_fd,专门用于跟这个客户端通读
if((new_sock = accept(socket,(struct sockaddr *)&client_addr,&addr_size))==INVALID_SOCKET)
{
return -1;
}
printf("---client (ip=%s:port=%d) download file %s\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),filename);
/* 创建下载线程,new_fd 作为线程参数传入*/
OS_ThreadCreate(&thread_id, thread_download_func, (void *)new_sock);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -