gyygyy007随便贴点东西

该程序使用Winsock库实现客户端与服务器之间的文件传输功能。通过将文件分成多个数据块进行发送,并利用套接字通信来完成整个文件的传输过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

server:

#include <Winsock2.h>
#pragma comment (lib,"ws2_32")

 

BYTE  command[1024*2];
 SOCKET sockSrv,sockConn;
 SOCKADDR_IN addrSrv,addrClient;
 int len=sizeof(SOCKADDR);
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 2, 2 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  AfxMessageBox("加载套接字库失败!");
  return;
 } 
 
 sockSrv=socket(AF_INET,SOCK_STREAM,0);
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(5555);
 
 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
 
 listen(sockSrv,5);
 
 
 while(1){
  sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
  if(sockConn == INVALID_SOCKET){
   continue;
  }

  memset((char*)&command,0,sizeof(command));
  if(recv(sockConn,(char*)&command,sizeof(command),0)==SOCKET_ERROR){
   break;
  }else{
   
   
   _SOCKET_STREAM_FILE_INFO* StreamFileInfo = (_SOCKET_STREAM_FILE_INFO*)command;
   
   
   CFileDialog Dlg(0,0,StreamFileInfo->szFileTitle); //选择保存文件位置
   if(Dlg.DoModal()!=IDOK) return;
   
   long FileLen= 0;
   FileLen = FileLen|(StreamFileInfo->nFileSizeHigh);
   FileLen = FileLen << 32;
   FileLen = FileLen|(StreamFileInfo->nFileSizeLow);
   
   
   CFile file;
   int  nChunkCount=FileLen/(1024*1024);
   if(nChunkCount==0){
    nChunkCount++;
   }else{
    
    if(FileLen%nChunkCount!=0){
     nChunkCount++;
    }
   }
   
   if(file.Open(Dlg.GetPathName(),CFile::modeWrite|CFile::typeBinary|CFile::modeCreate)){
    char *date = new char[1024*1024];
    
    for(int i=0;i<nChunkCount;i++){    
     
     long nLeft;
     
     if(i+1==nChunkCount)      //最后一块
      nLeft=FileLen-1024*1024*(nChunkCount-1);
     else
      nLeft=1024*1024;
     long FileLength = nLeft;
     
     int idx=0;
     
     while(nLeft>0){
      
      int ret=recv(sockConn,&date[idx],nLeft,0);
      
      if(ret==SOCKET_ERROR){
       AfxMessageBox("error");
       return;
      }
      
      idx+=ret;
      nLeft-=ret;
     }
     file.Write(date,FileLength);
    }
    file.Close();
    delete[] date;
   }    
  }
 }

 

client:

#include <Winsock2.h>
#pragma comment (lib,"ws2_32")

 

BYTE  command[1024*2];
 SOCKET server;
 SOCKADDR_IN serveraddr;
 WORD ver=MAKEWORD(2,2);
 WSADATA wsadata;
 WSAStartup(ver,&wsadata);

 server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 serveraddr.sin_family=AF_INET;
 serveraddr.sin_port=htons(5555);
 serveraddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 

 if(connect(server,(SOCKADDR*)&serveraddr,sizeof(serveraddr))<0)
 {
  
  AfxMessageBox("连接失败!");
  return ;
 }


 CFileDialog Dlg(TRUE);
 if(Dlg.DoModal()!=IDOK)    //选择文件对话框
  return;
 
 CFile myFile;         //选择要传输的文件
 if(!myFile.Open(Dlg.GetPathName(),CFile::modeRead|CFile::typeBinary))
 {
  AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);
  return;
 }
 
 SOCKET_STREAM_FILE_INFO StreamFileInfo;  //文件结构类型对象
 WIN32_FIND_DATA             FindFileData;

 HANDLE FindFileInfo;

 if( (FindFileInfo = FindFirstFile(Dlg.GetPathName(),&FindFileData)) == INVALID_HANDLE_VALUE)
 {
  AfxMessageBox("error");
  return;
 }
 
 FindClose(FindFileInfo);
    memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
    strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());
 //StreamFileInfo.szFileTitle          =       FindFileData.cFileName;
    StreamFileInfo.dwFileAttributes     =       FindFileData.dwFileAttributes;
    StreamFileInfo.ftCreationTime       =       FindFileData.ftCreationTime;
    StreamFileInfo.ftLastAccessTime     =       FindFileData.ftLastAccessTime;
    StreamFileInfo.ftLastWriteTime      =       FindFileData.ftLastWriteTime;
    StreamFileInfo.nFileSizeHigh        =       FindFileData.nFileSizeHigh;
 //memcpy(StreamFileInfo,FindFileData,sizeof(WIN32_FIND_DATA));
    StreamFileInfo.nFileSizeLow         =       FindFileData.nFileSizeLow;
 //AfxMessageBox(Dlg.GetPathName());

 long FileLen=0;
 FileLen = FileLen|StreamFileInfo.nFileSizeHigh;
 FileLen = FileLen << 32;
 FileLen = FileLen|StreamFileInfo.nFileSizeLow;
 
 memset((char*)&command,0,sizeof(command));
 
 memcpy((char*)&command,&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
 send(server,(char*)&command,sizeof(command),0);
 myFile.Close();

 

 //CFile myFile;
 if(!myFile.Open(Dlg.GetPathName(),CFile::modeRead|CFile::typeBinary))
 {
  AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);
  return;
 }
 
 
 int  nChunkCount=0; //文件块数 

 nChunkCount=FileLen/(1024*1024);
 if(nChunkCount==0) nChunkCount++;
 else
 {
  if(FileLen%nChunkCount!=0)
   nChunkCount++;
 }
 
 char *date=new char[1024*1024];
 
 for(int i=0;i<nChunkCount;i++)      //分块发送
 {
  long nLeft;
  
  if(i+1==nChunkCount)       //最后一块
   nLeft=FileLen-1024*1024*(nChunkCount-1);
  else
   nLeft=1024*1024;
  
  int idx=0;
  myFile.Read(date,nLeft);
  
  while(nLeft>0)
  {
   int ret=send(server,&date[idx],nLeft,0);
   if(ret==SOCKET_ERROR)
   {
    AfxMessageBox("网络断开!");
    return;
   }
   nLeft-=ret; 
   idx+=ret;
  }
 } 
 
 myFile.Close();
 AfxMessageBox("文件传输完成!");
 delete[] date;
 return;

 

文件结构:

typedef struct _SOCKET_STREAM_FILE_INFO {

    TCHAR       szFileTitle[128];                   //文件的标题名
    DWORD       dwFileAttributes;                   //文件的属性
    FILETIME    ftCreationTime;                     //文件的创建时间
    FILETIME    ftLastAccessTime;                   //文件的最后访问时间
    FILETIME    ftLastWriteTime;                    //文件的最后修改时间
    DWORD       nFileSizeHigh;                      //文件大小高位
    DWORD       nFileSizeLow;                       //文件大小低位
    DWORD       dwReserved0;                        //保留,为0
    DWORD       dwReserved1;                        //保留,为0

} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;

内容概要:本文档详细介绍了基于Google Earth Engine (GEE) 构建的阿比让绿地分析仪表盘的设计与实现。首先,定义了研究区域的几何图形并将其可视化。接着,通过云掩膜函数和裁剪操作预处理Sentinel-2遥感影像,筛选出高质量的数据用于后续分析。然后,计算中值图像并提取NDVI(归一化差异植被指数),进而识别绿地及其面积。此外,还实现了多个高级分析功能,如多年变化趋势分析、人口-绿地交叉分析、城市热岛效应分析、生物多样性评估、交通可达性分析、城市扩张分析以及自动生成优化建议等。最后,提供了数据导出、移动端适配和报告生成功能,确保系统的实用性和便捷性。 适合人群:具备一定地理信息系统(GIS)和遥感基础知识的专业人士,如城市规划师、环境科学家、生态学家等。 使用场景及目标:①评估城市绿地分布及其变化趋势;②分析绿地与人口的关系,为城市规划提供依据;③研究城市热岛效应及生物多样性,支持环境保护决策;④评估交通可达性,优化城市交通网络;⑤监测城市扩张情况,辅助土地利用管理。 其他说明:该系统不仅提供了丰富的可视化工具,还集成了多种空间分析方法,能够帮助用户深入理解城市绿地的空间特征及其对环境和社会的影响。同时,系统支持移动端适配,方便随时随地进行分析。用户可以根据实际需求选择不同的分析模块,生成定制化的报告,为城市管理提供科学依据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值