C++ UDP发送接收文件(BMP)

  //发送文件; 
#include <WinSock2.h>
#include <stdio.h>    
#include <stdlib.h>    
#include <string.h> 
  #pragma comment(lib,"ws2_32.lib")
#define DEST_PORT 3000    
#define MAX_DATA 51200  //50kb    
#define DEST_IP_ADDRESS "127.0.0.1" //"192.168.1.113"//"10.42.0.1" //"192.168.1.19"//"169.254.9.36"    
  
#ifndef bool    
#define bool int    
#define true 1    
#define false 0    
#endif    
  
int main(int argc,char* argv[])    
{    
    WORD ver;
    WSADATA WSAData;
 ver=MAKEWORD(1,1);
    if(WSAStartup(ver,&WSAData))
 {

  return 0;
 }
 if ( LOBYTE( WSAData.wVersion ) != 1 ||
  HIBYTE( WSAData.wVersion ) != 1 )
 {

  WSACleanup(); 
  return 0;
 }
 //与本地IP绑定
 SOCKET sock=socket(AF_INET,SOCK_DGRAM,0);
 SOCKADDR_IN addrS;
 addrS.sin_addr.s_addr=htonl(INADDR_ANY);
 addrS.sin_family=AF_INET;
 addrS.sin_port=htons(8899);
 bind(sock,(SOCKADDR*)&addrS,sizeof(SOCKADDR));
    //接收端的IP地址
 SOCKADDR_IN addrR;
    addrR.sin_addr.s_addr=inet_addr("127.0.0.1");
    addrR.sin_family=AF_INET;
    addrR.sin_port=htons(9988);
    int len=sizeof(SOCKADDR);
 //打开要发送文件
    BOOL    bSuccess ;
    HANDLE  hFile ;
 DWORD   dwFileSize, dwHighSize , dwBytesRead;
 hFile = CreateFile ("d:\\x.bmp", GENERIC_READ, FILE_SHARE_READ, NULL,
  OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
 if (hFile == INVALID_HANDLE_VALUE)
 {
 printf("hfle");
  getchar();
  return 0;
 }
 dwFileSize = GetFileSize (hFile, &dwHighSize);//获得文件的大小
 if (dwHighSize)
 {
  CloseHandle (hFile) ;
 printf("hfle2");
  getchar();
  return 0;
 }
 //发送文件大小
 char strFileSize[20];
 itoa(dwFileSize,strFileSize,10 );
 sendto(sock,strFileSize,20,0, (SOCKADDR*)&addrR,len);
 //读文件内容到readfile中
 BYTE *readfile;
 readfile=(BYTE*)malloc(dwFileSize);
    bSuccess = ReadFile (hFile, readfile, dwFileSize, &dwBytesRead, NULL) ;
 CloseHandle (hFile) ;
    if (!bSuccess || (dwBytesRead != dwFileSize))  
    {
  free (readfile) ;
   printf("hfle3");
    getchar();
  return 0;
 }
 
    //eachSend表示每次发送字符的大小
    DWORD eachSend=50*1024,retval,n,yu,i,j;
 BYTE  eachBuf[50*1024];
 n=dwFileSize / eachSend;  //共需要几次全额发送
 yu=dwFileSize % eachSend; //最后剩下的字符大小
    //先发送n次全额数据
 for(i=0;i<n;i++)
 {
  for(j=0;j<eachSend;j++)
  {
   eachBuf[j]=readfile[i*eachSend+j];
   
  }
  retval=sendto(sock,(char*)eachBuf,eachSend,0, (SOCKADDR*)&addrR,len);
  if(retval!=eachSend)
  {
 printf("adsf");
  getchar();
   return 0;
  }
        memset(eachBuf,0,50*1024);
 }
 //再发送剩下的字符
    for(i=0;i<yu;i++)
 {
  eachBuf[i]=readfile[n*eachSend+i];
 }
    retval=sendto(sock,(char*)eachBuf,yu,0, (SOCKADDR*)&addrR,len);
 if(retval!=yu)
 {

     return 0;
 }
 //中断winsocket库
    closesocket(sock);
    WSACleanup(); 
  printf("over");
 getchar();
    return 0;            
}    
//接收文件;

   
#include <WinSock2.h>
#include <stdio.h>    
#include <stdlib.h>    
#include <string.h> 
#include <time.h>
#pragma comment(lib,"ws2_32.lib")
#define SERV_PORT 3000    
#define MAX_DATA 51200  //50kb    
#define FILE_LENGTH 921654 //图片大小    
  
#ifndef bool    
#define bool int    
#define true 1    
#define false 0    
#endif    
  
int main()   
{    
WORD ver;
    WSADATA WSAData;
 ver=MAKEWORD(1,1);
    if(WSAStartup(ver,&WSAData))
 {
 printf("adsf2");
  getchar();
  return 0;
 }
 if ( LOBYTE( WSAData.wVersion ) != 1 ||
  HIBYTE( WSAData.wVersion ) != 1 )
 {
 printf("adsf3");
  getchar();
  WSACleanup(); 
  return 0;
 }
 //与本地IP绑定
 SOCKET sock=socket(AF_INET,SOCK_DGRAM,0);
 SOCKADDR_IN addrR;
 addrR.sin_addr.s_addr=htonl(INADDR_ANY);
 addrR.sin_family=AF_INET;
 addrR.sin_port=htons(9988);
 if(SOCKET_ERROR==bind(sock,(SOCKADDR*)&addrR,sizeof(SOCKADDR)))
 {
 printf("adsf4");
  getchar();
  WSACleanup(); 
  return 0;
 }

    //获取要接收文件的大小
 SOCKADDR_IN addrS;
    int len=sizeof(SOCKADDR);
 char strFileSize[20];
    recvfrom(sock,strFileSize,20,0,(SOCKADDR*)&addrS,&len);
	 printf("%s",strFileSize);
 DWORD   dwFileSize;
    dwFileSize=atoi(strFileSize); //文件大小
   int a=clock();
 DWORD eachRecv=50*1024,n,yu,i,j,retval;
 n=dwFileSize / eachRecv;
 yu=dwFileSize % eachRecv;
    char  eachBuf[50*1024];
  printf("adsf5111\n");
   
    BYTE *recvbuf=(BYTE*)malloc(dwFileSize);//初始化要存放数据的字符串
    for(i=0;i<n;i++)
 {
	 printf("adsf511133\n");
  retval=recvfrom(sock,eachBuf,eachRecv,0,(SOCKADDR*)&addrS,&len);
  if(retval!=eachRecv)
  {
 printf("adsf5");
  getchar();
   return 0;
  }
  for(j=0;j<eachRecv;j++)
  {
            recvbuf[i*eachRecv+j]=(BYTE)eachBuf[j];
  }
        memset(eachBuf,0,50*1024);
 }
	printf("adsf5111\n");
    retval=recvfrom(sock,eachBuf,yu,0, (SOCKADDR*)&addrR,&len);
 if(retval!=yu)
 {
printf("adsfbbbb");
  return 0;
 }
 for(i=0;i<yu;i++)
 {
  recvbuf[n*eachRecv+i]=(BYTE)eachBuf[i];
 }
 //写入文件
    FILE *fp;
    fp=fopen("d:\\bb.bmp","wb");
    fwrite(recvbuf,dwFileSize,1,fp);
    fclose(fp); 
  int b=clock()-a;
  printf("%d",b);
    //中断winsocket库
    closesocket(sock);
    WSACleanup(); 
	getchar();
    return 0;    
}    


  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值