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 的库,为了传输文件, ...
随机推荐
- sqoop1.4.6 全量导入与增量导入 与使用技巧
全量导入: sqoop import --connect jdbc:mysql://192.168.0.144:3306/db_blog --username root --password 1234 ...
- vc 自删除
// delself.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include <windows.h>#include &l ...
- VC查找字符串
第一种方式#include "stdafx.h" #include <string.h> #include <stdio.h> #include <W ...
- libvirt cpu mode
libvirt中 cpu mode可以有以下3种: custom : 该模式下cpu element用来描述guest可见的CPU,该模式也是mode的default模式,它会使得persistent ...
- jQuery Fancybox插件使用参数详解
Fancybox的特点如下: 可以支持图片.html文本.flash动画.iframe以及ajax的支持 可以自定义播放器的CSS样式 可以以组的形式进行播放 如果将鼠标滚动插件(mouse whee ...
- Spring Boot入门(二)
一.Spring Boot项目打包 1.引入maven打包相关插件 2.项目右击run as>Maven clean.run as>Maven install在target文件夹下会生成相 ...
- 用find命令查找最近修改过的文件
Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...
- 搭建svn服务器小结
最开始是用VisualSVN-Server来搭建服务器的,某一天安装了eset杀毒软件后,发现不能用了,每次打开配置页时报错.Visualsvn server 0x80070005 百度搜索,找到相同 ...
- 代码题(45)— 下一个排列、第k个排列
1.31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只 ...
- Wannafly挑战赛4 B,小AA的数列
题意:求子区间异或和,要求区间长度在l到r之间,并且为偶数 题解:对于每一位算贡献,可以分奇偶来记录,计算的时候只加上奇偶性相同的就保证了为偶数,从大于l的点开始每次++,从大于r的点每次--,记录二 ...