首页 > 系统相关 >VC++ Windows Socket 传输文件

VC++ Windows Socket 传输文件

时间:2024-12-21 21:53:30浏览次数:8  
标签:fp sockAddr Socket SOCKADDR Windows C++ include sin addr

服务端

// 服务端
#include <cstdio>
#include <cstdlib>
#include <WinSock2.h>
#include <Ws2tcpip.h>   // inet_pton 函数所在头文件
#pragma comment(lib, "ws2_32.lib") // 加载 ws2_32.dll

#define BUF_SIZE 1024

int main()
{
	// 检查文件是否存在
	const char *filename = "D:\\script.sql";
	FILE *fp = nullptr;
	fopen_s(&fp, filename, "rb"); // 二进制方式打开
	if (!fp)
	{
		printf("%s 文件打开出错!", filename);
		system("pause");
		exit(0);
	}

	long curPos = ftell(fp);
	if (fseek(fp, 0, SEEK_END) != 0) // 成功返回 0
	{
		exit(0);
	}
	long fileSize = ftell(fp);
	if (fseek(fp, curPos, SEEK_SET) != 0)
	{
		exit(0);
	}
	printf("文件大小: %d 字节。", fileSize);

	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN sockAddr;
	memset(&sockAddr, 0, sizeof(sockAddr));
	sockAddr.sin_family = PF_INET;
	//sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
	// 有警告,用下面新函数替换 https://blog.csdn.net/qq_22642239/article/details/102456232
	inet_pton(AF_INET, "127.0.0.1", &sockAddr.sin_addr.s_addr);
	sockAddr.sin_port = htons(1234);

	bind(servSock, (SOCKADDR*)(&sockAddr), sizeof(SOCKADDR));
	listen(servSock, 1);

	SOCKADDR clntAddr;
	int nSize = sizeof(SOCKADDR);
	SOCKET clntSock = accept(servSock, (SOCKADDR *)(&clntAddr), &nSize);

	// 循环发送数据
	char buffer[BUF_SIZE] = { 0 }; // 缓冲区

	size_t nCount = 0;
	while ((nCount = fread(buffer, 1, BUF_SIZE, fp)) > 0)
	{
		send(clntSock, buffer, static_cast<int>(nCount), 0);
	}

	shutdown(clntSock, SD_SEND); // 文件读取完毕,断开输出流,向客户端发送 FIN 包
	recv(clntSock, buffer, BUF_SIZE, 0); // 阻塞, 等待客户端接受完毕

	fclose(fp);
	closesocket(clntSock);
	closesocket(servSock);
	WSACleanup();

	system("pause");
	return 0;
}

客户端

//客户端

#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>
#include <Ws2tcpip.h>   // inet_pton 函数所在头文件

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

#define BUF_SIZE 1024

int main()
{
	//先输入文件名,看文件是否能创建成功
	char filename[128] = "D:\\sock_test_file2.txt";//文件名
	printf("Input filename to save:");
	//gets(filename);
	//以二进制方式打开(创建)文件
	FILE *fp = nullptr;
	fopen_s(&fp, filename, "wb");
	if (!fp)
	{
		printf("Cannot open file, press any key to exit!\n");
		system("pause");
		exit(0);
	}

	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

	struct sockaddr_in sockAddr;
	memset(&sockAddr, 0, sizeof(sockAddr));
	sockAddr.sin_family = PF_INET;
	//sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	inet_pton(PF_INET, "127.0.0.1", &sockAddr.sin_addr.s_addr);
	sockAddr.sin_port = htons(1234);
	connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));

	//循环接收数据,直到文件传输完毕
	char buffer[BUF_SIZE] = { 0 };
	int nCount = 0;
	while ((nCount = recv(sock, buffer, BUF_SIZE, 0)) > 0)
	{
		fwrite(buffer, nCount, 1, fp);
	}
	puts("File transfer success!");

	//文件接收完毕后直接关闭套接字,无需调用shutdown()
	fclose(fp);
	closesocket(sock);
	WSACleanup();

	system("pause");
	return 0;
}

经测试下来,可以传送文件。




代码源自:https://www.cnblogs.com/cq51/p/15533371.html 博文

标签:fp,sockAddr,Socket,SOCKADDR,Windows,C++,include,sin,addr
From: https://www.cnblogs.com/huvjie/p/18621419

相关文章

  • 2024年华为OD机试真题-字符串变换最小字符串-C++-OD统一考试(E卷)
     最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,持续跟新。 题目描述࿱......
  • C++, sal.h的初见
    一路挖UE的Memcpy,不小心挖到了这个头文件sal.h。 成片的宏张牙舞爪,就像你应声开门以为是肯德基结果是佛伯乐的骇然 sal是什么呢?https://learn.microsoft.com/en-us/cpp/code-quality/understanding-sal?view=msvc-170全称是Microsoftsource-codeannotationlanguage......
  • 掌握DevEco Studio这一功能,高效实现ArkTS与C++胶水代码
    掌握DevEcoStudio这一功能,高效实现ArkTS与C++胶水代码1、背景介绍HarmonyOS主要提供了ArkTS与C++作为开发语言:ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,保持了TS的基本风格,同时通过规范定义强化开发期静......
  • HarmonyOS Next开发工具DevEco Studio介绍:ASan与TSan检测根治你的C++恐惧症
    1、背景介绍很多开发者面对C++都很犯怵,其中主要的一块就是内存操作。不合理的内存操作,比如数组越界、内存泄露、释放已释放的地址,可能会引起程序性能问题:内存消耗大,卡顿,更严重的会导致程序出现崩溃。当应用运行发生错误使应用进程终止时,应用将会抛出错误日志以通知应用崩溃......
  • 详解 C++ 中的无序容器
    在C++中,无序容器(unorderedcontainers)是指基于哈希表实现的容器,主要特点是元素存储顺序无关,强调高效的插入、删除和查找操作。以下是C++标准库中所有无序容器的详解。无序容器分类C++中的无序容器主要包括以下4类:unordered_setunordered_multisetunordered_mapun......
  • 32.Python基础篇-socketserver模块
    socketserver模块是什么?是Python中一个用于简化基于socket的网络服务实现的模块。它提供了一些高层次的类,帮助开发者更容易地实现网络服务。可以实现并发请求处理使用socketserver实现的server端,代码演示:importsocketserver#导入socketserver模块,用于简化基于sock......
  • 实验六 C++
    任务四:Vector.hpp:#pragmaonce#ifndefVECTOR_HPP#defineVECTOR_HPP#include<iostream>#include<stdexcept>//为异常类提供支持#include<memory>//为std::unique_ptr提供支持template<typenameT>classVector{private:std::uniqu......
  • 30.Python基础篇-socket模块
    介绍socket模块是用于实现网络通信的模块。它提供了底层网络操作的接口,使得用户可以通过网络实现客户端和服务器之间的数据传输。通过socket模块,程序可以通过网络进行数据传输、连接和通信。使用socket模块创建一个TCP服务server端代码#server端代码importsocketsk......
  • 【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】
    【华为OD-E卷-寻找关键钥匙100分(python、java、c++、js、c)】题目小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。每个箱子中都有一个字符串s,字符串由大写字母、小写字母、数字、标点符号......
  • 【华为OD-E卷-最多提取子串数目 100分(python、java、c++、js、c)】
    【华为OD-E卷-最多提取子串数目100分(python、java、c++、js、c)】题目给定[a-z],26个英文字母小写字符串组成的字符串A和B,其中A可能存在重复字母,B不会存在重复字母,现从字符串A中按规则挑选一些字母,可以组成字符串B。挑选规则如下:同一个位置的字母只能挑选一次......