⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcp_file_svr.c

📁 linux下的多个网络通讯的例子 可多参考下
💻 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 + -