windows环境下使用C++&Socket实现文件传输
2024-09-05 09:03:56
server
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <fstream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
SOCKET m_Client;
void SendFile();
int main(int argc, char* argv[])
{
//初始化WSA
WORD sockVersion = MAKEWORD(2,2);
WSADATA wsaData;
if(WSAStartup(sockVersion, &wsaData)!=0)
{
return 0;
}
//创建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(slisten == INVALID_SOCKET)
{
printf("socket error !");
return 0;
}
//绑定IP和端口
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("bind error !");
}
//开始监听
if(listen(slisten, 5) == SOCKET_ERROR)
{
printf("listen error !");
return 0;
}
//循环接收数据
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
char revData[255];
while (true)
{
printf("等待连接...\n");
m_Client = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
if(m_Client == INVALID_SOCKET)
{
printf("accept error !");
continue;
}
printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
SendFile();
closesocket(m_Client);
}
closesocket(slisten);
WSACleanup();
return 0;
}
void SendFile(){
int haveSend = 0;
const int bufferSize = 1024;
char buffer[bufferSize] = {0};
int readLen = 0;
string srcFileName = "in";
ifstream srcFile;
srcFile.open(srcFileName.c_str(),ios::binary);
if(!srcFile){
return;
}
while(!srcFile.eof()){
srcFile.read(buffer,bufferSize);
readLen = srcFile.gcount();
send(m_Client,buffer,readLen,0);
haveSend += readLen;
}
srcFile.close();
cout<<"send: "<<haveSend<<"B"<<endl;
}
client
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <fstream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
SOCKET m_Client;
void RecvFile();
int main()
{
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if(WSAStartup(sockVersion, &data)!=0)
{
return 0;
}
//while(true){
m_Client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(m_Client == INVALID_SOCKET)
{
printf("invalid socket!");
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if(connect(m_Client, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{ //连接失败
printf("connect error !");
closesocket(m_Client);
return 0;
}
RecvFile();
closesocket(m_Client);
//}
WSACleanup();
return 0;
}
void RecvFile(){
cout<<"start recv!"<<endl;
const int bufferSize = 1024;
char buffer[bufferSize] = {0};
int readLen = 0;
string desFileName = "new_in";
ofstream desFile;
desFile.open(desFileName.c_str(), ios::binary);
if (!desFile)
{
return ;
}
do
{
readLen = recv(m_Client,buffer,bufferSize, 0);
if (readLen == 0)
{
break;
}
else
{
desFile.write(buffer, readLen);
}
} while(true);
desFile.close();
}
最新文章
- iOS.StaticLibrary.1-avoid-duplicate-symbol-in-static-library[draft]
- [原]My first Python
- FastJson与Gson小测试
- APAC Practice
- Apache虚拟主机设置
- MDK常见错误详解集合
- Linux系统安装-MacBook网卡驱动问题解决
- z-index是什么样式?
- JDBC编程流程以及详细代码
- React Fiber源码分析 第一篇
- flask 自动切换环境
- 操作Linux系统环境变量的几种方法
- MongoDB服务无法启动,windows提示发生服务特定错误:100
- 564. Find the Closest Palindrome
- SPSS学习系列之SPSS Modeler怎么修改默认的内存大小(图文详解)
- 【bzoj1187】 HNOI2007—神奇游乐园
- POJ.3087 Shuffle'm Up (模拟)
- [C/C++语言标准] ISO C99/ ISO C11/ ISO C++11/ ISO C++14/ISO C++17 Downloads
- 我对PageRank的理解及R语言实现
- WPF触控程序开发(四)——MultiTouchVista_-_second_release_-_refresh_2的救赎
热门文章
- Python回归分析五部曲(二)—多重线性回归
- BZOJ 2402 陶陶的难题II (树链剖分、线段树、凸包、分数规划)
- 最近公共祖先lca模板
- FileZilla 客户端连接vsftp无法访问 Received unexpected end-of-file from SFTP server 解决之路
- centos7下面ruby的升级
- Python 文件writelines() 方法和处理双层列表
- ubuntu 17.04 添加用户到sudo组
- Python——sklearn提供的自带的数据集
- Vue + Webpack-simple 怎么修改生产环境下运行的端口?
- 机器学习 - 算法 - 集成算法 - 分类 ( Bagging , Boosting , Stacking) 原理概述