TCP文件发送
发送端(客户端)
#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文件发送的更多相关文章
- 基于TCP的大文件发送、UDP、socketserver
基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...
- TCP大文件发送案例以及UDP介绍
基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...
- QT TCP文件上传服务器
利用QT做为client端,纯C语言做为server端,利用tcp协议,实现client端向server端传递文件 Linux服务器端 //头文件 #include <stdio.h> # ...
- 为什么TCP连接不可靠
原文链接:http://watter1985.iteye.com/blog/1924977 原文在此 这篇文章是关于TCP网络编程的一个不起眼的小问题.几乎人人都并不太明白这个问题是怎么回事.曾经我以 ...
- Windows 系统下json 格式的日志文件发送到elasticsearch
Windows 系统下json 格式的日志文件发送到elasticsearch配置 Nxlog-->logstash-->ElasticSearch Logstash https://ww ...
随机推荐
- Shell脚本实现检测某ip网络畅通情况,实战用例
Shell脚本实现检测某ip网络畅通情况,实战用例 环境准备,linux shell 发送email 邮件:1.安装sendmailyum -y install sendmail安装好sendmail ...
- Qt学习之路(45): 自定义model之一
前面我们说了Qt提供的几个预定义model.但是,面对变化万千的需求,那几个model是远远不能满足我们的需要的.另外,对于Qt这种框架来说,model的选择首先要能满足绝大多数功能的需要,这就是说, ...
- ajax return true/false无效原因
错误示例:function checkCP(customerId,productId){ $.ajax({ url:"/cp/checkCP", type:"post&q ...
- C 运算优先级口诀
运算优先级口诀: 括号成员第一; //括号运算符[]() 成员运算符. -> 全体单目第二; //所有的单目运算符比如!.~.++. --. +(正). -(负) ...
- 20145314郑凯杰《网络对抗技术》实验9 web安全基础实践
20145314郑凯杰<网络对抗技术>实验9 web安全基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET ...
- Android实践项目汇报(总结)
天气客户端开发报告 1 系统需求分析 1.1功能性需求分析 天气预报客户端,最基本就是为用户提供准确的天气预报信息.天气查询结果有两种:一种是当天天气信息,信息结果比较详细,除温度.天气状况外还 ...
- 超频真的不难!G3258超频4.5GHz全攻略
奔腾G3258搭配主板详解 [pconline 应用]目前DIY市场上最火热的装机组合莫过于奔腾20周年纪念版处理器G3258搭配B85芯片组主板,只要通过适当的超频,相对较低投入也能来不错的性能体验 ...
- noip2015 day1
不解释,很简单,直接按照题目的方法构造就行了 Code #include<iostream> #include<cstdio> #include<cctype> # ...
- POJ 1236 Network of Schools(tarjan)题解
题意:一个有向图.第一问:最少给几个点信息能让所有点都收到信息.第二问:最少加几个边能实现在任意点放信息就能传遍所有点 思路:把所有强连通分量缩成一点,然后判断各个点的入度和出度 tarjan算法:问 ...
- php能干什么?
什么是cookies 简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机.当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookie 会帮 ...