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
发表评论: