ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TCP 客户端发送文件到服务器

2021-08-03 23:57:37  阅读:129  来源: 互联网

标签:BUFF filePath int TCP printf 服务器 客户端 SIZE buff


server.cpp

#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <WinSock2.h>
#include<string.h>

#pragma comment(lib,"wsock32.lib")

using namespace std;

//缓存大小设置不能超过2M
#define BUFF_SIZE (1024 * 256)
#define FILE_NAME_LENGTH 1024


int s;                     /* socket for accepting connections    */
int ns;                    /* socket connected to client          */


int getFileSize(char *filePath) {
    FILE *f;
    f = fopen(filePath, "rb");
    if (NULL == f) {
        printf("getFileSize fopen error\n");
        return -1;
    }

    if (0 != fseek(f, 0, SEEK_END)) {
        printf("getFileSize fseek error\n");
        return -1;
    }

    int fileSize = ftell(f);
    if (fileSize < 0) {
        printf("ftell error\n");
    }
    printf("fileSize:%lld\n", fileSize);
    fclose(f);
    return fileSize;
}

char *getFileName(char *filePath) {
    bool bFound = false;
    char *buff = new char[1024];
    memset(buff, 0, 1024);
    while (!bFound) {
        int lastIndex = 0;
        for (int i = 0; i < strlen(filePath); ++i) {
            if (filePath[i] == '\\' || filePath[i] == '/') {
                lastIndex = i;
            }
        }
        for (int i = lastIndex + 1; i < strlen(filePath); ++i) {
            buff[i - lastIndex - 1] = filePath[i];
        }
        bFound = true;
    }
    return buff;
}


int main(int argc, char **argv)
{
	// _onexit(exitFunc);
	unsigned short port;       /* port server binds to                */
	char buff[BUFF_SIZE];              /* buffer for sending & receiving data */
	struct sockaddr_in client; /* client address information          */
	struct sockaddr_in server; /* server address information          */
	int namelen;               /* length of client name               */
	char *filePath = new char[FILE_NAME_LENGTH];

	port = 23/*(unsigned short) atoi(argv[1])*/;

	//filePath = "C:\\Users\\18131\\Desktop\\期货窗口截图\\内存扫描.txt";


	int fileSize;
	char *fileName;

	WSADATA wsadata;
	WSAStartup(0x202, &wsadata);

	//创建socket服务
	if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("socket error\n");
		exit(2);
	}

	//socket和服务地址绑定
	server.sin_family = AF_INET;
	server.sin_port = htons(port);
	server.sin_addr.s_addr = inet_addr("127.0.0.1")/*INADDR_ANY*/;

	if (bind(s, (struct sockaddr *)&server, sizeof(server)) < 0)
	{
		printf("bind error\n");
		exit(3);
	}

	//监听服务,只允许一个客户端连接
	if (listen(s, 1) != 0)
	{
		printf("listen error\n");
		exit(4);
	}

	//等待连接
	namelen = sizeof(client);
	//循环 一直等待客户端的连接
	if ((ns = accept(s, (struct sockaddr *)&client, &namelen)) == -1)
	{
		printf("accept error\n");
		//exit(5);
	}



	int fileRecv = 0;//记录接收文件
	FILE *f = NULL;//文件
	int totalFileSize = 0;

	while (true) {
		循环 一直等待客户端的连接

		int iRecv = 0;
		memset(buff, 0, BUFF_SIZE);
		iRecv = recv(ns, buff, BUFF_SIZE, 0);
		//解析接收到的消息
		char recvstr[BUFF_SIZE];
		strcpy(recvstr, buff);
		if (iRecv < 0) {
			printf("recv message error\n");
			//exit(5);
		}
		else
		{
			if (memcmp(buff, "filesize=", 9) == 0)//接收为文件大小
			{
			
				char tempbf[BUFF_SIZE];
				strcpy(tempbf, &buff[9]);
				totalFileSize = atoll(tempbf);
				printf("%s,%d\n", buff, totalFileSize);
				memset(buff, 0, BUFF_SIZE);
				//memset(tempbf, 0, BUFF_SIZE);
				//memset(buff, 0, BUFF_SIZE);

			}

			if (memcmp(buff, "fileName=", 9) == 0)//开始发送标志
			{
				printf("buff=%s\n", buff);
				char tempbf[BUFF_SIZE];
				strcpy(tempbf, &buff[9]);
				printf("tempbf=%s\n", tempbf);

				strcpy(filePath, "D:\\client\\");
				//filePath = ;
				//strcat()
				strcat(filePath, tempbf);

				printf("filePath=%s\n", filePath);


				创建接收文件

				f = fopen(filePath, "wb");
				if (f == NULL) {
					printf("file:%s doesn't exist and failed to create\n", filePath);
				}

				memset(tempbf, 0, BUFF_SIZE);
				memset(buff, 0, BUFF_SIZE);


				send(ns, "startsend", 9, 0);

				//printf("%s\n", recvstr);

			}

			if (memcmp(buff, "clientSend", 9) == 0)//开始发送标志
			{
				while (true)
				{

						int iRecv = 0;
						if (memcmp(buff, "clientSend", 9) != 0&&memcmp(buff, "SendFinish", 9) != 0)
						{
							memset(buff, 0, BUFF_SIZE);
							iRecv = recv(ns, buff, BUFF_SIZE, 0);
						}

						//解析接收到的消息
						char recvstr[BUFF_SIZE];
						strcpy(recvstr, buff);
						if (iRecv < 0) {
							printf("recv message error\n");
							//exit(5);
						}
						else
						{
							if (fileRecv <= totalFileSize&&buff[0]!='\0'&&memcmp(buff, "SendFinish", 9) != 0/*&&memcmp(buff, "clientSend", 9) != 0*/) {
								
								if (memcmp(buff, "clientSend", 9) != 0)
								{
									fileRecv += iRecv;
									fwrite(buff, 1, iRecv, f);
									printf("%s\n", buff);
								}
								//memset(tempbf1, 0, BUFF_SIZE);
								memset(buff, 0, BUFF_SIZE);

								send(ns, "recvEnd", 7, 0);
							}
							else
							{
								fclose(f);
								printf("传输完成?\n");
								break;
							}
						}
					}
				break;
			}
		}
	}
	system("pause");
}


client.cpp

#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <iostream>

#include <stdio.h>
#include <WinSock2.h>
#include <time.h>

#pragma comment(lib,"wsock32.lib")

using namespace std;

//缓存大小设置不能超过2M
#define BUFF_SIZE (1024 * 256)

#define FILE_NAME_LENGTH 1024

int s;                     /* client socket                       */

int getFileSize(char *filePath) {
	FILE *f;
	f = fopen(filePath, "rb");
	if (NULL == f) {
		printf("getFileSize fopen error\n");
		return -1;
	}

	if (0 != fseek(f, 0, SEEK_END)) {
		printf("getFileSize fseek error\n");
		return -1;
	}

	int fileSize = ftell(f);
	if (fileSize < 0) {
		printf("ftell error\n");
	}
	printf("fileSize:%lld\n", fileSize);
	fclose(f);
	return fileSize;
}

char *getFileName(char *filePath) {
	bool bFound = false;
	char *buff = new char[1024];
	memset(buff, 0, 1024);
	while (!bFound) {
		int lastIndex = 0;
		for (int i = 0; i < strlen(filePath); ++i) {
			if (filePath[i] == '\\' || filePath[i] == '/') {
				lastIndex = i;
			}
		}
		for (int i = lastIndex + 1; i < strlen(filePath); ++i) {
			buff[i - lastIndex - 1] = filePath[i];
		}
		bFound = true;
	}
	return buff;
}

/*
* Client Main.
*/
int main(int argc, char** argv)
{
	//_onexit(exitFunc);

	WSADATA wsadata;
	WSAStartup(0x202, &wsadata);
	printf("start...\n");

	unsigned short port;       //服务端口
	char buf[BUFF_SIZE];       //缓存
	struct hostent *hostnm;    //服务地址信息
	struct sockaddr_in server; //服务sockaddr信息

							   //传入两个参数,顺序是服务器地址和端口
	port = 23/* (unsigned short)atoi(argv[2])*/;

	server.sin_family = AF_INET;
	server.sin_port = htons(port);
	server.sin_addr.s_addr = inet_addr("127.0.0.1") /**((unsigned long *)hostnm->h_addr)*/;

	//创建socket
	if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("Socket error\n");
	}

	//准备连接服务端
	printf("ready to connet to server ...\n");
	if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
	{
		printf("Connect error\n");
	}

	char buff[BUFF_SIZE];              /* buffer for sending & receiving data */

	//获取要发送文件的信息
	char *filePath = new char[FILE_NAME_LENGTH];
	filePath = "C:\\Users\\18131\\Desktop\\期货窗口截图\\易联众PACS 3.6影像浏览工作站使用说明书.pdf";

	int fileSize = getFileSize(filePath);
	printf("fileSize:%lld\n", fileSize);
	char *fileName = getFileName(filePath);
	printf("fileName:%s\n", fileName);


	//打开文件
	FILE *f;
	f = fopen(filePath, "rb");
	if (f == NULL) {
		printf("file:%s doesn't exist\n", filePath);
		exit(6);
	}


	int sendSize = 0;
	//先将文件大小的数据发送给服务器
	_itoa(fileSize, buff, 10);
	char tempbuff[BUFF_SIZE];
	strcpy(tempbuff, buff);
	sprintf(buff, "filesize=%s", tempbuff);
	if (send(s, buff, sizeof(buff), 0) < 0) {
		printf("send fileSize to client error\n");
	}
	else
	{
		memset(buff, 0, BUFF_SIZE);
		printf("send fileSize to client sucess\n");
	}

	//再将文件名发送给服务器
	strcpy(tempbuff, fileName);
	sprintf(fileName, "fileName=%s", tempbuff);
	if (send(s, fileName, strlen(fileName), 0) < 0) {
		printf("send fileName to client error\n");
	}
	else
	{
		memset(fileName, 0, strlen(fileName));
		printf("send fileName to client sucess\n");
	}

	//发送文件真实开始

		while (true)
		{
			int iRecv = 0;
			memset(buff, 0, BUFF_SIZE);
			iRecv = recv(s, buff, BUFF_SIZE, 0);

			
				char recvEnd[BUFF_SIZE];
				memset(recvEnd, 0, BUFF_SIZE);

				if (memcmp(buff, "startsend", 9) == 0)
				{
					send(s, "clientSend", 10, 0);//开始发送

				    while (sendSize < fileSize) {

					if (memcmp(recvEnd, "recvEnd", 7) == 0)//判断是否接收完成
					{
						memset(buff, 0, BUFF_SIZE);
						size_t iread = fread(buff, 1, BUFF_SIZE, f);
						printf("iread:%d\n", iread);
						if (iread < 0) {
							printf("fread error\n");
							fclose(f);
							break;
						}

						int iSend = send(s, buff, iread, 0);
						if (iSend < 0) {
							printf("send error\n");
							fclose(f);
							break;
						}
						else
						{
							memset(buff, 0, BUFF_SIZE);
						}
						sendSize += iSend;
						printf("fileSize:%lld iSend:%d sendSize:%lld\n", fileSize, iSend, sendSize);
						fseek(f, sendSize, SEEK_SET);
						memset(recvEnd, 0, BUFF_SIZE);

					}
					recv(s, recvEnd, BUFF_SIZE, 0);//接收完成
			}
				send(s, "SendFinish", 10, 0);//告诉服务器文件发送完毕
				fclose(f);//关闭文件
				break;
		}
    }
	printf("Client Ended Successfully\n");
	//exit(0);
	system("pause");
}


标签:BUFF,filePath,int,TCP,printf,服务器,客户端,SIZE,buff
来源: https://blog.csdn.net/weixin_39518639/article/details/119361841

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有