• 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(2,2),&wsaData);
        if(errStartup!=0){
            cout<<"初始化失败"<<endl;
            return -1;
        }
        s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(s==INVALID_SOCKET){
            cout<<"创建socket失败"<<endl;
            return -2;
        }
        SOCKADDR_IN addr;
        memset(&addr,0,sizeof(addr));
        addr.sin_family=AF_INET;
        addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
        addr.sin_port=htons(30000);
    
        errBind= bind(s,(SOCKADDR*)&addr,sizeof(addr));
        if(errBind!=0){
            cout<<"bind failed!"<<endl;
            return -3;
        }
        listen(s,3);
    
        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)+1,0);
           
            char sendFileBuf[1024];
            memset(sendFileBuf,0,sizeof(sendFileBuf));
            DWORD dwRead=NULL;
            HANDLE hFile=CreateFile(filename,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
            while (true)
            {
                if(!ReadFile(hFile,sendFileBuf,1024,&dwRead,0)){
                    cout<<"read buf error!"<<endl;
                    break;
                }else if(dwRead==0)
                {
                    cout<<"send over"<<endl;
                    break;
                }else
                {
                    send(sockClient,sendFileBuf,dwRead,0);
                }
            }
            CloseHandle(hFile);
            shutdown(sockClient,SD_BOTH);
            closesocket(sockClient);
        }
        
        closesocket(s);
        WSACleanup();
        system("pause");
        return 0;
    }

    客户端为接收端:

    #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(2,2),&wsaData);
    
        SOCKET clientSock=socket(AF_INET,SOCK_STREAM,0);
        memset(&s,0,sizeof(s));
        s.sin_family=AF_INET;
        s.sin_addr.S_un.S_addr=inet_addr("172.18.4.161");
        s.sin_port=htons(30000);
        conerr= connect(clientSock,(SOCKADDR*)&s,sizeof(s));
        if(conerr!=0){
            cout<<"connect failed:"<<conerr<<endl;
    
        }
        //接收文件名,并拼接文件存放路径
        char recBuf[128];
        recv(clientSock,recBuf,128,0);
        
        char filename[128]="c:\";
        strcat(filename,recBuf);
    
        cout<<"文件位置"<<filename<<endl;
            char recFileBuf[1024];
            
            int numRead;
            DWORD dwWrite;
            DWORD tmp=0;
            HANDLE hFile=CreateFile(filename,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
        while (true)
            {
                numRead=recv(clientSock,recFileBuf,1024,0);
                if(numRead==SOCKET_ERROR){
                    cout<<"connect error"<<endl;
                    break;
                }
                tmp=tmp+numRead;
                if(numRead==0){
                    cout<<"receive over"<<endl;        
                    break;
                }
                if(!WriteFile(hFile,recFileBuf,numRead,&dwWrite,0)){
                    cout<<"write failed!"<<endl;
                    break;
                }        
            }
        cout<<"共接收:"<<tmp<<" 字节"<<endl;
        CloseHandle(hFile);
        system("pause");
       return 0; 
    }
  • 相关阅读:
    一、left
    padding溢出
    一、
    Python创建、删除桌面、启动组快捷方式的例子分享
    openstack常见问题解决方法总结
    __attribute__ 详解
    __ATTRIBUTE__ 知多少?
    CentOS如何设置终端显示字符界面区域的大小
    shell使用技巧
    openstack 安全策略权限控制等api接口
  • 原文地址:https://www.cnblogs.com/duyy/p/3748963.html
Copyright © 2020-2023  润新知