• windows环境下使用C++&Socket实现文件传输


    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("等待连接...
    ");  
            m_Client = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);  
            if(m_Client == INVALID_SOCKET)  
            {  
                printf("accept error !");  
                continue;  
            }  
            printf("接受到一个连接:%s 
    ", 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();
    }
    
  • 相关阅读:
    tech 浅谈 Yield
    Python strip lstrip rstrip使用方法
    Python strip lstrip rstrip使用方
    Python 的学习脚印(1)
    python中列表的赋值
    python的re模块的sub方法
    Python的异常处理机制
    [python] shutil模块
    【ActiveMq】启动amq时遇到java.net.URISyntaxException: Illegal character in hostname at index处理方法
    【sql总结】
  • 原文地址:https://www.cnblogs.com/bitor/p/9486892.html
Copyright © 2020-2023  润新知