• win32 tcp文件传输客户端


    #include<stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <string.h>
    
    #pragma comment(lib,"ws2_32.lib")
    
    #define PORT 9999
    #define IPADDR "127.0.0.1"
    #define BACKLOG 20
    #define FILENAME 200
    #define LENGTH 200
    #define BUFFERSIZE 1024
    
    struct FILEHEAD //FILE-head  struct
    {
    	char filename[LENGTH];//file name
    	//char ext[LENGTH];
    	unsigned int length;//the byte of the file
    
    };
    
    struct FILEDATA //FILE-data  struct
    {
    	char filename[LENGTH];//file name
    	char package[BUFFERSIZE];//package data
    	unsigned int length;//the byte of the file
    	unsigned int index;//index of the package
    	
    };
    
    void getFileInformation(FILEHEAD file)
    {
    	printf( "file information :\n" );
    	printf( "  Filename: %s\n", file.filename );
    	//printf( "  Ext: %s\n", file.ext );
    	printf( "  length is btye: %ld btye\n", file.length );
    }
    
    
    int main(int argc, char *argv[])
    {
    	FILEHEAD filehead;
    	FILEDATA filedata;
    	WSADATA wsadata;
    	WSAStartup(MAKEWORD(2,0),&wsadata);
    	SOCKET sock_trans=socket(AF_INET,SOCK_STREAM,0);
    	
    	memset(&filehead,0,sizeof(filehead));
    	memset(&filedata,0,sizeof(filedata));
    	
    	if (0==sock_trans)
    	{
    		printf ("socket build faile!!\n");
    		exit(1);
    	}
    	
    	printf ("target pc's IP address: 127.0.0.1\n");
    	printf("输入文件名(包括路径):\n");
    	scanf("%s",filehead.filename);
    	
    	//如果正式调试,将服务器端ip写死。
    		
    	SOCKADDR_IN sockadd;
    	sockadd.sin_family=AF_INET;
    	sockadd.sin_port=htons(PORT);
    	sockadd.sin_addr.S_un.S_addr=inet_addr(IPADDR);
    	
    	int con_info=connect(sock_trans,(SOCKADDR*)&sockadd,sizeof(sockadd));
    	
    	if (SOCKET_ERROR==con_info)
    	{
    		printf ("connect fail!\n");
    		exit(1);
    	}
    	
    	//Sleep(100);
    
    	FILE *fp= NULL;
    	fp=fopen(filehead.filename,"rb");
    	if (NULL==fp)
    	{
    		printf("cannot open the %s \n",filehead.filename);
    		exit(1);
    	}
    	
    	fseek(fp,0l,SEEK_END);//此处将fp移到了文件末尾,要移动回去,不然读文件总是零
    	filehead.length=ftell(fp);
    	fseek(fp,0l,SEEK_SET);//将文件指针移动回头部
    
    	char ext[LENGTH]={0};
    	_splitpath(filehead.filename, NULL, NULL, filehead.filename, ext);//分割文件名
    	strcat(filehead.filename,ext);
    	strcpy(filedata.filename,filehead.filename);
    
    	getFileInformation(filehead);
    
    	//setFileInformation();
    	//freed_return_val=fread(buf,1,1024,fp);//读文件字符
    	//char buf[BUFFER];	
    	int fread_return_val=0;//文件读出字符的返回值
    	Sleep(3000);
    
    	//发送文件头信息
    	printf("发送文件头信息...\n");
    	send(sock_trans,(char *)&filehead,sizeof(filehead),0);
    
    	//char buf[BUFFERSIZE]={0};
    	filedata.index=0;
    	printf("发送文件信息...\n");
    	while (1)		
    		{	
    			fread_return_val=fread(filedata.package,1,BUFFERSIZE,fp);
    			//fread_return_val=fread(buf,1,BUFFERSIZE,fp);
    			if (0==fread_return_val)
    			{
    				break;
    			}
    			filedata.index++;
    			send(sock_trans,(char *)&filedata,sizeof(filedata),0);
    			//send(sock_trans,buf,BUFFERSIZE,0);
    			printf("第%d块发送完成!\n",filedata.index);		
    		}
    
    
    	
    	
    	
    	fclose(fp);
    	
    	closesocket(sock_trans);
    	WSACleanup();
    	printf("\n发送文件完成...\n");	
    
    	system("pause");
    	
    	return 0;
    	
    }
    


     

  • 相关阅读:
    函数要多小才够好——谈小函数之道
    vb.net 打字练习
    vb.net 打字练习
    vb.net 打字练习
    unsigned int 与 unsigned long 一样吗?
    epoll使用详解(精髓)
    论epoll的使用 高调coding,低调做人 C++博客
    学习使用epoll The time is passing ITeye技术网站
    ubuntu下sed命令详解 Dicky 开源中国社区
    分享:jquery遍历之children()与find()的区别
  • 原文地址:https://www.cnblogs.com/wuyida/p/6301480.html
Copyright © 2020-2023  润新知