发送端(客户端)

 #include <iostream>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <fstream>
using namespace std; #pragma comment(lib, "ws2_32.lib") struct FileHeader
{ char m_szFileName[MAX_PATH];//windows下,全文件名的字符长度是有限制的,众所周知,是MAX_PATH,260
int m_nFileSize; }; int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != ) { printf("WSAStartup failed with error: %d\n", err);
return ;
} if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != ) { printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return ;
}
else
printf("The Winsock 2.2 dll was found okay\n"); SOCKET sockClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sockClient)
{
WSACleanup();
return ;
}
cout<<"请输入服务器iP"<<endl;
char szip[] = {};
cin>>szip;
sockaddr_in addr; addr.sin_addr.S_un.S_addr=inet_addr("192.168.202.1"); addr.sin_family = AF_INET;
//addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.251");
addr.sin_port = htons(); if(SOCKET_ERROR == connect(sockClient,(const sockaddr*)&addr,sizeof(addr)))
{
WSACleanup();
closesocket(sockClient);
return ;
} char szFilePath[MAX_PATH] = {};
char *ptemp = szFilePath;
char szResult[] = {};//是,否
char szContent[] = {};//文件内容
//文件头
//文件名,文件大小
FileHeader fh;
cout<<"请输入要传输的文件"<<endl;
cin>>szFilePath; //获得文件名
while(*ptemp++ != '\0');
while(*(--ptemp) != '\\');//\\是一个字符
ptemp++; strcpy_s(fh.m_szFileName,MAX_PATH,ptemp); fstream fs;
fs.open(szFilePath,fstream::in|fstream::binary);//以二进制流的方式读入,中间是'|' fs.seekg(,fstream::end);//使文件指针偏移到末尾,用法详细可以见:
fh.m_nFileSize = fs.tellg(); //获得文件指针所在位置的文件大小
fs.seekg(,fstream::beg);//将文件指针偏移位置置回0
//发送,先发送文件的基本信息
send(sockClient,(const char*)&fh,sizeof(fh),); //等待对方回复
recv(sockClient,szResult,sizeof(szResult),); if( == strcmp(szResult,"是"))
{
//如果是肯定回复 while()
{
//读文件
fs.read(szContent,sizeof(szContent));
int nRelReadNum = fs.gcount();
if(nRelReadNum == )
{
break;
}
//发文件
send(sockClient,szContent,nRelReadNum,);
} }
//关闭文件
fs.close();
closesocket(sockClient);
WSACleanup();
system("pause");
return ;
}

接收端(服务器)

 #include<stdio.h>
#include<iostream>
#include<fstream>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
struct fileFifo
{
char fileName[MAX_PATH];
int fileSize;
};
int main()
{
//初始化wsa
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != )
{ printf("WSAStartup failed with error: %d\n", err);
return ;
} if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{ printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return ;
}
else
printf("The Winsock 2.2 dll was found okay\n"); SOCKET sever;
SOCKET waiter;
struct sockaddr_in severaddr;
struct sockaddr_in clientaddr;
char recvbuf[];//接受缓冲区
char sendbuf[];//发送缓冲区
//创建套接字
sever=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sever==INVALID_SOCKET)
{
WSACleanup();
return ;
}
/*if(sever=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)
{
WSACleanup();
return 1;
}*/
//绑定
severaddr.sin_family=AF_INET;
severaddr.sin_port=htons();
severaddr.sin_addr.S_un.S_addr=inet_addr("192.168.202.1"); if(bind(sever,(const sockaddr*)&severaddr,sizeof(severaddr))==SOCKET_ERROR)
{
WSACleanup();
closesocket(sever);
return ;
}
if(listen(sever,)==SOCKET_ERROR)
{
WSACleanup();
return ;
}
printf("等待连接...\n");
int clientlen=sizeof(clientaddr);
waiter=accept(sever,(SOCKADDR*)&clientaddr,&clientlen);
if(waiter==INVALID_SOCKET)//第一个参数为监听套接字
{
printf("接受失败\n");
WSACleanup();
closesocket(sever);
return ;
}
char filePath[MAX_PATH];
char result[]={};
char context[];
fileFifo file;
fstream fs;
recv(waiter,(char *)&file,sizeof(file),);//发送的和接受的数据类型要一致 cout<<"文件大小为:"<<file.fileSize<<endl;
cout<<"请输入是否接受该文件"<<endl;
cin>>result;
int tempsize=file.fileSize; send(waiter,result,sizeof(result),); if(strcmp(result,"是")==)
{
cout<<"您要存储得路径为:"<<endl;
cin>>filePath;
strcat_s(filePath,MAX_PATH,file.fileName);
//对应路径下创建文件用于接受
fs.open(filePath,fstream::binary|fstream::out|fstream::trunc);
while(tempsize)
{
//接收文件内容
int numRecv=recv(waiter,context,sizeof(context),);
//写文件
if(numRecv>)
{
tempsize-=numRecv;
fs.write(context,numRecv);
}
}
}
fs.close();
WSACleanup();
closesocket(sever);
closesocket(waiter);
system("pause");
return ;
}

TCP文件发送的更多相关文章

  1. 基于TCP的大文件发送、UDP、socketserver

    基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...

  2. TCP大文件发送案例以及UDP介绍

    基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...

  3. 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  4. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  5. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  6. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  7. QT TCP文件上传服务器

    利用QT做为client端,纯C语言做为server端,利用tcp协议,实现client端向server端传递文件 Linux服务器端 //头文件 #include <stdio.h> # ...

  8. 为什么TCP连接不可靠

    原文链接:http://watter1985.iteye.com/blog/1924977 原文在此 这篇文章是关于TCP网络编程的一个不起眼的小问题.几乎人人都并不太明白这个问题是怎么回事.曾经我以 ...

  9. Windows 系统下json 格式的日志文件发送到elasticsearch

    Windows 系统下json 格式的日志文件发送到elasticsearch配置 Nxlog-->logstash-->ElasticSearch Logstash https://ww ...

随机推荐

  1. 代码静态扫描工具sonar

    一.SonarQube整体介绍 SonarQube为静态代码检查工具,采用B/S架构,帮助检查代码缺陷,改善代码质量,提高开发速度,通过插件形式,可以支持Java.C.C++.JavaScripe等等 ...

  2. python之路----进程(一)

    一.理论知识1.操作系统发展简介 1.没有操作系统 —— 穿孔卡片 2.批处理系统 —— 串行 ,速度块 联机批处理 读磁带的时候速度快 脱机批处理 读磁带和cpu工作并发 3.多道程序系统 —— 并 ...

  3. JavaScript 读取修改元素 及 伸拉门案例

    JavaScript 读取修改元素 及 伸拉门案例 版权声明:未经授权,严禁转载! 读取 / 修改元素 - 读取修改元素内容 - 读取修改元素属性 - 读取修改元素样式 元素的内容 读取或修改元素节点 ...

  4. troubleshooting-执行Oozie调度Hive导数脚本抛java.io.IOException: output.properties data exceeds its limit [2048]

    执行Oozie调度Hive导数脚本抛java.io.IOException: output.properties data exceeds its limit [2048] 原因分析 shell脚本中 ...

  5. bzoj 1179 [APIO 2009]Atm(APIO水题) - Tarjan - spfa

    Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  6. Python3基础 hasattr 测试类是否有指定的类属性

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. C简介与环境配置

    C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的.C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现. 在 1978 年,布莱 ...

  8. 海量数据处理-BitMap算法

    一.概述 本文将讲述Bit-Map算法的相关原理,Bit-Map算法的一些利用场景,例如BitMap解决海量数据寻找重复.判断个别元素是否在海量数据当中等问题.最后说说BitMap的特点已经在各个场景 ...

  9. linux下安装/升级openssl

    (2810)  (1) 安装环境: 操作系统:CentOs7 OpenSSL Version:openssl-1.0.2j.tar.gz 安装: 目前版本最新的SSL地址为 http://www.op ...

  10. C语言通过枚举网卡,API接口可查看man 7 netdevice--获取接口IP地址

    /*代码来自StackOverflow: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-c ...