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

📄 tcp_file_cli.c

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