前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >win32 tcp文件传输并发服务器

win32 tcp文件传输并发服务器

作者头像
流川疯
发布2019-01-18 14:25:30
9030
发布2019-01-18 14:25:30
举报
文章被收录于专栏:流川疯编写程序的艺术
代码语言:javascript
复制
#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
	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

};

struct sockaddr_in clientaddr;  //Definition of the external variable for thread function call

void getFileInformation(FILEHEAD file)
{
	printf( "file information :\n" );
	printf( "  Filename: %s\n", file.filename );
	//printf( "  Ext: %s\n", file.ext );
	printf( " the file length is: %ld btye\n", file.length );
}

void showClientinfo()
{
	//获取当前系统时间
	SYSTEMTIME st;
	GetLocalTime(&st);
	char SysDate[30];
	//将systime中的时间转变为字符串存入SysDate[30];
	sprintf(SysDate, "%4d-%2d-%2d %2d:%2d:%2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
	//Server显示客户端信息
	printf("%s Recv from Client [%s:%d] : %s\n", SysDate, inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
	//服务器向客户端回显信息
}

DWORD WINAPI requestThread(LPVOID lparam)
{
	FILEHEAD filehead;
	FILEDATA filedata;
	SOCKET newsock=(SOCKET)(LPVOID)lparam;
	//char buf[BUFFERSIZE]={0};
	memset(&filehead,0,sizeof(filehead));
	memset(&filedata,0,sizeof(filedata));

	showClientinfo();

	//printf("等待文件头信息 ...\n");

	int length_file_info=recv(newsock,(char *)&filehead,sizeof(filehead),0);
	if (SOCKET_ERROR==length_file_info)
	{
		printf("receive failed!\n");
		closesocket(newsock);
		return -1;
		
	}
	if (length_file_info<=0)
	{
		exit(1);//异常退出
	}

	getFileInformation(filehead);//打印文件信息

	FILE *fp=NULL;
	fp=fopen(filehead.filename,"wb+");
	if (NULL==fp)
	{
		perror("fail to build the file!!!\n");
		exit(1);
	}
	
	//printf("要接收的文件名为:");
	//printf(filehead.filename);//打印文件名	
	//printf ("\n catch file now....\n");
	
	int recv_length=0;//接收到字节的长度
	
	//Sleep(100);
	
	printf("开始接收...\n");
	filedata.index=0;
	while (1)
	{
		recv_length=recv(newsock,(char *)&filedata,sizeof(filedata),0);
		if (recv_length == SOCKET_ERROR)
		{
			printf("recv failed !\n");
			closesocket(newsock);
			//WSACleanup();
			return -1;
		}
		
		fwrite(filedata.package,1,BUFFERSIZE,fp);
		if (0==recv_length)
		{
			break;
		}
		//printf("第%d块接收成功!\n",filedata.index);
	}
	printf("\n接收完成...\n\n");
	
	fflush(fp);
	fclose(fp);
	fp=NULL;
	
	return 0;
}

int main(int argc,char *argv[])
{
	//初始化winsock版本信息,加载动态链接库(dll)
	WSADATA wsData;
	if (WSAStartup(MAKEWORD(2,2),&wsData)!=0)
	{
		printf("WSAStartup failed !!!\n");
		return -1;
	}
	
	//创建套接字
	SOCKET socklisten;
	if((socklisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
	{
		printf("socket failed!!!\n");
		WSACleanup();
		return -1;
	}
	
	//设置服务器地址
	struct sockaddr_in servaddr;
	
	memset(&servaddr,0,sizeof(servaddr));
	servaddr.sin_family=AF_INET;
	servaddr.sin_port=htons(PORT);
	servaddr.sin_addr.S_un.S_addr=inet_addr(IPADDR);
	
	//绑定socket地址结构到监听套接字
	if (bind(socklisten,(sockaddr *)&servaddr,sizeof(servaddr))!=0)
	{
		printf("binding failed!!!\n");
		closesocket(socklisten);
		WSACleanup();
	}
	
	//在server上运行监听
	if (listen(socklisten,20)!=0)
	{
		printf("listen failed !!!\n");
		closesocket(socklisten);
		WSACleanup();
		return -1;
	}
	
	//接收客户端的连接请求
	printf("TCP server is start!!!\n");
	
	//clientaddrlength要有初值,
	int client_addr_length = sizeof(clientaddr);
	memset(&clientaddr,0,client_addr_length);
	SOCKET connect;
	
	//循环等待
	while (1)
	{
		if ((connect=accept(socklisten,(sockaddr *)&clientaddr,&client_addr_length))==INVALID_SOCKET)
		{
			printf("accept failed!!!\n");
			closesocket(connect);
			WSACleanup();
			return -1;
		}
		
		//创建新线程
		DWORD ThreadID;
		CreateThread(NULL,0,requestThread,(LPVOID)connect,0,&ThreadID);
	}
	
	

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013年01月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档