文件传输的原理:发送方把文件读到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 传输文件的更多相关文章

  1. 利用scp传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本地目 ...

  2. mac与windows通过ftp传输文件

    1.两个系统相互传文件,比较通用的方式是用QQ,两台电脑一台各登陆一个qq,发文件就行了,在同一个网段时,qq会自动转换为按局域网的方式传输. 2.本人不愿安装qq,以ftp方式进行传输,先在wndo ...

  3. 使用SecureCRT在远程主机和本地之间传输文件

    终于弄明白怎样在SecureCRT的shell里用命令上传下载文件.SecureCRT记住密码的功能容易设置,于是偶这懒人,后来习惯了用 SecureCRT,但其上传文件功能偶一直没弄明白过.之前一直 ...

  4. python起的 simpleHTTPServer服务传输文件

    python起的 simpleHTTPServer服务传输文件 经同事的介绍,在Linux上传输文件的一种特别方便的方法: python -m SimpleHTTPServer [端口] 端口不填 默 ...

  5. 利用SSH传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...

  6. Ubuntu 16.04 安装ftp服务器传输文件

    最近在搞深度学习,老师比较宝贝他的服务器,要求我以后负责管理服务器.往后所有要使用服务器的人都必须向我申请账号,然后只允许客户端访问,使用文件传输软件传输文件.像我这样一个linux菜逼,这种要求不是 ...

  7. Servlet学习三——传输文件

    最先在考虑传输文件时,想通过java写一个文件上传案例,传给Servlet,Servlet再保存至数据库中,但苦于一直没找到实例,听说Flex有实际的例子,就直接用Flex例子来测试了.本文的顺序为: ...

  8. ssh传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...

  9. golang 远程传输文件

    概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件, ...

随机推荐

  1. djang-分页

    分页 views from django.shortcuts import render,HttpResponse # Create your views here. from app01.model ...

  2. php中浮点型变量

    $d = (0.1+0.7)*10;//$d为8 //floor函数返回不大于value的最接近的整数,舍去小数部分取整 $e = floor($d);//$e为7 为什么$e为7,而不是8 因为$d ...

  3. java 读取src下的配置文件

    很多时候,我们都将配置文件放在eclipse的src目录下,这个位置,相当于,当导出可执行jar包后,配置文件放在和jar同级的目录中,比如jar包放在/opt目录下,则配置文件放在/opt下,则ja ...

  4. C语言基础三

    C--数组 一维数组的定义和引用 定义:类型说明符 数组名[常量表达式] int a[ 10 ];他表示定义了一个整形数组,数组名为a,有10个元素. 注意:C语言不允许对数组的大小做动态定义. 一维 ...

  5. Spring使用proxool连接池 管理数据源

    一.Proxool连接池简介及其配置属性概述 Proxool是一种Java数据库连接池技术.是sourceforge下的一个开源项目,这个项目提供一个健壮.易用的连接池,最为关键的是这个连接池提供监控 ...

  6. deep learning (六)logistic(逻辑斯蒂)回归中L2范数的应用

    zaish上一节讲了线性回归中L2范数的应用,这里继续logistic回归L2范数的应用. 先说一下问题:有一堆二维数据点,这些点的标记有的是1,有的是0.我们的任务就是制作一个分界面区分出来这些点. ...

  7. nginx Win下实现简单的负载均衡(2)站点共享Session

    快速目录: 一.nginx Win下实现简单的负载均衡(1)nginx搭建部署 二.nginx Win下实现简单的负载均衡(2)站点共享Session 三.nginx Win下实现简单的负载均衡(3) ...

  8. RNN、LSTM、Char-RNN 学习系列(一)

    RNN.LSTM.Char-RNN 学习系列(一) zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouw  2016-3-15 版权声明 ...

  9. static数据成员与const数据成员的定义与初始化

    三种数据类型的初始化 1.static int a 的初始化 const int a 的初始化 static const int a的初始化 三种初始化方式 在类外初始化 在构造函数中通过初始化列表初 ...

  10. MAMP mac下启动Mysql

    MAMP mac下启动Mysql /Applications/MAMP/Library/bin/mysql -u root -p 初始密码 root: