Winsock 传输文件
文件传输的原理:发送方把文件读到socket发送端缓冲区中,接收方把socket接收端缓端冲区中的数据写到一个新文件中。当然了,大文件需要循环读写!
服务器端为发送端:
#include "stdafx.h"
#include<winsock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib") using namespace std;
int main(){
WSADATA wsaData;
SOCKET s;
int errStartup,errBind;
errStartup=WSAStartup(MAKEWORD(,),&wsaData);
if(errStartup!=){
cout<<"初始化失败"<<endl;
return -;
}
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET){
cout<<"创建socket失败"<<endl;
return -;
}
SOCKADDR_IN addr;
memset(&addr,,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addr.sin_port=htons(); errBind= bind(s,(SOCKADDR*)&addr,sizeof(addr));
if(errBind!=){
cout<<"bind failed!"<<endl;
return -;
}
listen(s,); SOCKADDR_IN addrClient;
int len=sizeof(addrClient); char *filename="e:\\winSQL.zip";
while (true)
{
SOCKET sockClient=accept(s,(SOCKADDR*)&addrClient,&len);
//用于发送文件名
char *sendBuf="winSQL.zip";
int sendNum= send(sockClient,sendBuf,strlen(sendBuf)+,); char sendFileBuf[];
memset(sendFileBuf,,sizeof(sendFileBuf));
DWORD dwRead=NULL;
HANDLE hFile=CreateFile(filename,GENERIC_READ,,,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,);
while (true)
{
if(!ReadFile(hFile,sendFileBuf,,&dwRead,)){
cout<<"read buf error!"<<endl;
break;
}else if(dwRead==)
{
cout<<"send over"<<endl;
break;
}else
{
send(sockClient,sendFileBuf,dwRead,);
}
}
CloseHandle(hFile);
shutdown(sockClient,SD_BOTH);
closesocket(sockClient);
} closesocket(s);
WSACleanup();
system("pause");
return ;
}
客户端为接收端:
#include "stdafx.h"
#include <WinSock2.h>
#include <iostream>
using namespace std; #pragma comment(lib,"ws2_32.lib") int _tmain(int argc, TCHAR *argv[])
{
WSADATA wsaData;
SOCKADDR_IN s;
int conerr;
WSAStartup(MAKEWORD(,),&wsaData); SOCKET clientSock=socket(AF_INET,SOCK_STREAM,);
memset(&s,,sizeof(s));
s.sin_family=AF_INET;
s.sin_addr.S_un.S_addr=inet_addr("172.18.4.161");
s.sin_port=htons();
conerr= connect(clientSock,(SOCKADDR*)&s,sizeof(s));
if(conerr!=){
cout<<"connect failed:"<<conerr<<endl; }
//接收文件名,并拼接文件存放路径
char recBuf[];
recv(clientSock,recBuf,,); char filename[]="c:\\";
strcat(filename,recBuf); cout<<"文件位置"<<filename<<endl;
char recFileBuf[]; int numRead;
DWORD dwWrite;
DWORD tmp=;
HANDLE hFile=CreateFile(filename,GENERIC_WRITE,,,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,);
while (true)
{
numRead=recv(clientSock,recFileBuf,,);
if(numRead==SOCKET_ERROR){
cout<<"connect error"<<endl;
break;
}
tmp=tmp+numRead;
if(numRead==){
cout<<"receive over"<<endl;
break;
}
if(!WriteFile(hFile,recFileBuf,numRead,&dwWrite,)){
cout<<"write failed!"<<endl;
break;
}
}
cout<<"共接收:"<<tmp<<" 字节"<<endl;
CloseHandle(hFile);
system("pause");
return ;
}
Winsock 传输文件的更多相关文章
- 利用scp传输文件
在linux下一般用scp这个命令来通过ssh传输文件. 从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本地目 ...
- mac与windows通过ftp传输文件
1.两个系统相互传文件,比较通用的方式是用QQ,两台电脑一台各登陆一个qq,发文件就行了,在同一个网段时,qq会自动转换为按局域网的方式传输. 2.本人不愿安装qq,以ftp方式进行传输,先在wndo ...
- 使用SecureCRT在远程主机和本地之间传输文件
终于弄明白怎样在SecureCRT的shell里用命令上传下载文件.SecureCRT记住密码的功能容易设置,于是偶这懒人,后来习惯了用 SecureCRT,但其上传文件功能偶一直没弄明白过.之前一直 ...
- python起的 simpleHTTPServer服务传输文件
python起的 simpleHTTPServer服务传输文件 经同事的介绍,在Linux上传输文件的一种特别方便的方法: python -m SimpleHTTPServer [端口] 端口不填 默 ...
- 利用SSH传输文件
在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...
- Ubuntu 16.04 安装ftp服务器传输文件
最近在搞深度学习,老师比较宝贝他的服务器,要求我以后负责管理服务器.往后所有要使用服务器的人都必须向我申请账号,然后只允许客户端访问,使用文件传输软件传输文件.像我这样一个linux菜逼,这种要求不是 ...
- Servlet学习三——传输文件
最先在考虑传输文件时,想通过java写一个文件上传案例,传给Servlet,Servlet再保存至数据库中,但苦于一直没找到实例,听说Flex有实际的例子,就直接用Flex例子来测试了.本文的顺序为: ...
- ssh传输文件
在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...
- golang 远程传输文件
概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件, ...
随机推荐
- 剑指Offer——重建二叉树2
Question 输入某二叉树的后序遍历和中序遍历的结果,请重建出该二叉树.假设输入的后序遍历和中序遍历的结果中都不含重复的数字.例如输入后序遍历序列{1, 3, 4, 2}和中序遍历序列{1, 2, ...
- 報錯:One or more validation errors were detected during model generation:System.Data.Edm.EdmEntityType: : EntityType 'Movie' has no key
報錯:One or more validation errors were detected during model generation:System.Data.Edm.EdmEntityType ...
- tp5定时器
# 定时器 * * * * * cd /home/wwwroot/default/dexin/dragon && /usr/bin/php think order --option 1 ...
- php特级课---1、网站大访问量如何解决
php特级课---1.网站大访问量如何解决 一.总结 一句话总结: 负载均衡和冗余技术 1.负载均衡和冗余技术是一回事么? 并不是:负载均衡是用户分流:冗余技术是避免出现单点故障 负载均衡:将不同的用 ...
- Asp.net 检测到有潜在危险的 Request.From值
因为Asp.net对客户端提交的数据进行了基本的安全验证,检测是否有最基础的 sql注入 或者 xss跨站脚本攻击代码. 如果你提交了:</div><script type=&quo ...
- C++中内部类访问外部类的私有成员
首先,如果不知道什么是内部类InnerClass的话,就没必要往下看了. 尝试在C++中模仿apple objective-c 的Grand Dispatch简化多线程编程时,使用了boost::fu ...
- SQL Server循环插入数据
--循环执行插入10000条数据declare @ID intdeclare @eigyousyocode nvarchar(16)declare @datet datetimedeclare @pl ...
- axios 拦截 , 页面跳转, token 验证(自己摸索了一天搞出来的)
最近做项目,需要登录拦截,验证.于是使用了axios的拦截器(也是第一次使用,摸索了1天,终于搞出来了,真是太高兴啦!!!),废话不多说,直接上代码, 项目结构:vue-cli + webpack + ...
- Python - 批量改变文件名
import osimport sysimport datetime path = "E:\python_test"datename = '2016-02-11'a = datet ...
- Python&&ipython安装注意事项
yum源里没有,需要先安装一个epel-release这个包,它提供的yum源里有,然后在yum install python-pip.ftp://ftp.muug.mb.ca/mirror/cent ...