C++ windows下利用winsock进行文件传输
2019-07-31
直接上代码,服务端是接收文件的,客户端才是发送文件的
/*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 RecvFile();
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));
RecvFile();
closesocket(m_Client);
}
closesocket(slisten);
WSACleanup();
return 0;
}
void RecvFile()
{
cout << "接收开始" << endl;
const int bufferSize = 1024;
char buffer[bufferSize] = { 0 };
int readLen = 0;
string SaveFileName = "D:\\002.txt"; //这是服务器要接收的文件的保存路径
ofstream desFile;
desFile.open(SaveFileName.c_str(), ios::binary);
if (!desFile)
{
return;
}
do
{
readLen = recv(m_Client, buffer, bufferSize, 0);
if (readLen == 0)
{
break;
}
else
{
desFile.write(buffer, readLen);
cout << "接收完毕" << endl;
}
} while (true);
desFile.close();
}/*cilent*/
#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()
{
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;
}
SendFile();
closesocket(m_Client);
//}
WSACleanup();
while (1);
return 0;
}
void SendFile()
{
int haveSend = 0;
const int bufferSize = 1024;
char buffer[bufferSize] = { 0 };
int readLen = 0;
string srcFileName = "D:\\001.txt"; //这是用户端要发送的路径
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;
}不是没有截图,是懒得截图,反正两段代码一运行就可以了,需要注意的是,如果你是同一台电脑测试,请记住先运行server端,再运行cilent
发表评论: