TCP 协议文件传输示例

一个简单的传输的例子 单线程 阻塞模式.  

 以下是发送端代码

send.cpp

  1. //---------------------------------------------------------------------------  
  2. #include <iostream>  
  3. #include "winsock2.h"   
  4.   
  5. using namespace std;  
  6. #pragma comment(lib , "ws2_32.lib")   
  7.   
  8. //---------------------------------------------------------------------------   
  9.   
  10.   
  11.   
  12. WSADATA wsaData;   
  13.   
  14. UINT uTimerID;   
  15.   
  16. DWORD MAX_SIZE = 1024 * 4;   
  17.   
  18. DWORD FinishSize = 0;   
  19.   
  20. DWORD SendSize = MAX_SIZE;   
  21.   
  22. LPSTR SFileName;   
  23.   
  24. DWORD FSize;   
  25.   
  26. DWORD DWSpeed=0;   
  27.   
  28. DWORD OldFinish=0;   
  29.   
  30.   
  31.   
  32. MMRESULT (WINAPI *ptimeSetEvent)(UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent);   
  33.   
  34. MMRESULT (WINAPI *ptimeKillEvent)(UINT uTimerID);   
  35.   
  36. HINSTANCE DLLInst;   
  37.   
  38.   
  39.   
  40. bool init()   
  41.   
  42. {   
  43.   
  44.     DLLInst=LoadLibrary("winmm.dll");   
  45.   
  46.     if(DLLInst)   
  47.   
  48.     {   
  49.   
  50.         ptimeSetEvent = (MMRESULT (WINAPI *)(UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent))GetProcAddress(DLLInst, "timeSetEvent");   
  51.   
  52.         if(!ptimeSetEvent) return false;   
  53.   
  54.         ptimeKillEvent = (MMRESULT (WINAPI *)(UINT uTimerID))GetProcAddress(DLLInst, "timeKillEvent");   
  55.   
  56.         if(!ptimeKillEvent) return false;   
  57.   
  58.         return true;   
  59.   
  60.     }   
  61.   
  62.     return false;   
  63.   
  64. }   
  65.   
  66.   
  67.   
  68. void Byte2Human(const DWORD & byte)   
  69.   
  70. {   
  71.   
  72.     if(byte < 1024){   
  73.   
  74.         cout << ((float)((int)(byte*100+0.5))/100.0) << "B";   
  75.   
  76.         return;   
  77.   
  78.     }   
  79.   
  80.     float kb = byte/1024;   
  81.   
  82.     if (kb<1024){   
  83.   
  84.         cout << ((float)((int)(kb*100+0.5))/100.0) << "KB";   
  85.   
  86.         return ;   
  87.   
  88.     }   
  89.   
  90.     float mb = kb/1024;   
  91.   
  92.     if (mb<1024){   
  93.   
  94.         cout << ((float)((int)(mb*100+0.5))/100.0) << "MB";   
  95.   
  96.         return;   
  97.   
  98.     }   
  99.   
  100.     float gb = mb/1024;   
  101.   
  102.     cout << ((float)((int)(gb*100+0.5))/100.0) << "GB";   
  103.   
  104. }   
  105.   
  106.   
  107.   
  108. void WINAPI TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)   
  109.   
  110. {   
  111.   
  112.     DWSpeed = FinishSize-OldFinish;   
  113.   
  114.     OldFinish = FinishSize;   
  115.   
  116.     cout << '/r';   
  117.   
  118.     cout << "                                                                              ";   
  119.   
  120.     cout << '/r';   
  121.   
  122.     cout << "文件名:" << SFileName << " " << FinishSize << "/" << FSize << " ";   
  123.   
  124.     Byte2Human(DWSpeed);   
  125.   
  126.     cout << "/S";   
  127.   
  128. }   
  129.   
  130.   
  131.   
  132. int main(int argc, char* argv[])   
  133.   
  134. {   
  135.   
  136.     if(!init())   
  137.   
  138.     {   
  139.   
  140.         cout<<"初始化失败"<<endl;   
  141.   
  142.         return 0;   
  143.   
  144.     }   
  145.   
  146.     int ret;   
  147.   
  148.     if(argc < 4)   
  149.   
  150.     {   
  151.   
  152.         cout << "App.exe Host Port FileName" << endl;   
  153.   
  154.         return 0;   
  155.   
  156.     }   
  157.   
  158.   
  159.   
  160.     if((ret=WSAStartup(0x0202, &wsaData))!=0)   
  161.   
  162.     {   
  163.   
  164.         cout << "WSAStartup Failed!! Code:" << ret << endl;   
  165.   
  166.         return 0;   
  167.   
  168.     }   
  169.   
  170.     SOCKET sock;   
  171.   
  172.     struct sockaddr_in server;   
  173.   
  174.     sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   
  175.   
  176.     if(sock==INVALID_SOCKET)   
  177.   
  178.     {   
  179.   
  180.         cout << "创建socket出错" << endl;   
  181.   
  182.         return 0;   
  183.   
  184.     }   
  185.   
  186.     server.sin_family=AF_INET;   
  187.   
  188.     server.sin_port=htons(atoi(argv[2]));   
  189.   
  190.     server.sin_addr.s_addr=inet_addr(argv[1]);   
  191.   
  192.     cout << "正在连接 " << argv[1] << ":" << argv[2] << endl;   
  193.   
  194.     if(connect(sock, (struct sockaddr *)&server, sizeof(server))==SOCKET_ERROR)   
  195.   
  196.     {   
  197.   
  198.         cout << "连接失败" << endl;   
  199.   
  200.         return 0;   
  201.   
  202.     }   
  203.   
  204.     cout << "连接成功" << endl;   
  205.   
  206.   
  207.   
  208.     //打开文件准备发送   
  209.   
  210.     HANDLE hFile;   
  211.   
  212.     OFSTRUCT ofs;   
  213.   
  214.     HANDLE hMap;   
  215.   
  216.     void *pVoid;   
  217.   
  218.     SFileName = argv[3];   
  219.   
  220.     hFile=(HANDLE)OpenFile(argv[3], &ofs, OF_READWRITE | OF_SHARE_DENY_NONE);   
  221.   
  222.     if((HFILE)hFile==HFILE_ERROR)   
  223.   
  224.     {   
  225.   
  226.         cout << "打开文件失败 ErrorCode=" << GetLastError() << endl;   
  227.   
  228.         return 0;   
  229.   
  230.     }   
  231.   
  232.     FSize=GetFileSize((HANDLE)hFile, NULL);   
  233.   
  234.     hMap=CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);   
  235.   
  236.     if(hMap==NULL)   
  237.   
  238.     {   
  239.   
  240.         cout << "打开映射失败 ErrorCode=" << GetLastError() << endl;   
  241.   
  242.         return 0;   
  243.   
  244.     }   
  245.   
  246.     pVoid=MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);   
  247.   
  248.     if(pVoid==NULL)   
  249.   
  250.     {   
  251.   
  252.         cout << "映射数据失败 ErrorCode=" << GetLastError() << endl;   
  253.   
  254.         return 0;   
  255.   
  256.     }   
  257.   
  258.     char *p = (char *)pVoid;   
  259.   
  260.     cout << "正在发送文件 " << argv[3] << endl;   
  261.   
  262.     uTimerID=ptimeSetEvent(1000, 0, (LPTIMECALLBACK)TimeProc, NULL, TIME_PERIODIC|TIME_CALLBACK_FUNCTION);   
  263.   
  264.   
  265.   
  266.     while(1)   
  267.   
  268.     {   
  269.   
  270.         if(FSize - FinishSize < MAX_SIZE)   
  271.   
  272.         {   
  273.   
  274.             SendSize = FSize - FinishSize;   
  275.   
  276.         }   
  277.   
  278.         int ret = send(sock, p+FinishSize, SendSize, 0);   
  279.   
  280.         if(ret == SOCKET_ERROR )   
  281.   
  282.         {   
  283.   
  284.             cout << endl << "Ret=" << ret << " ErrorCode=" << WSAGetLastError() << endl;   
  285.   
  286.             return 0;   
  287.   
  288.         }   
  289.   
  290.         FinishSize += ret;   
  291.   
  292.         if(FinishSize == FSize) break;   
  293.   
  294.     }   
  295.   
  296.     closesocket(sock);   
  297.   
  298.     ptimeKillEvent(uTimerID);   
  299.   
  300.     CloseHandle(hMap);   
  301.   
  302.     CloseHandle(hFile);   
  303.   
  304.     cout << endl;   
  305.   
  306.     cout << "完成 发送数据量:" << FinishSize << endl;   
  307.   
  308.     return 0;   
  309.   
  310. }   
  311.   
  312. //---------------------------------------------------------------------------  
view plain copy to clipboard print ?
  1.    
view plain copy to clipboard print ?
  1. 以下是接收端代码  
view plain copy to clipboard print ?
  1. recv.cpp<PRE class=csharp name="code">//---------------------------------------------------------------------------  
  2. #include <iostream>  
  3. #include "winsock2.h"   
  4. using namespace std;</PRE>   
  5. <PRE class=csharp name="code">  
  6. #pragma comment(lib , "ws2_32.lib")   
  7.   
  8. //---------------------------------------------------------------------------</PRE>   
  9. <PRE class=csharp name="code">   
  10.   
  11. WSADATA wsaData;   
  12.   
  13. DWORD FinishSize = 0;   
  14.   
  15. DWORD OldFinish=0;   
  16.   
  17. DWORD DWSpeed=0;   
  18.   
  19. UINT uTimerID;   
  20.   
  21.   
  22.   
  23. MMRESULT (WINAPI *ptimeSetEvent)(UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent);   
  24.   
  25. MMRESULT (WINAPI *ptimeKillEvent)(UINT uTimerID);   
  26.   
  27. HINSTANCE DLLInst;   
  28.   
  29.   
  30.   
  31. bool init()   
  32.   
  33. {   
  34.   
  35.     DLLInst=LoadLibrary("winmm.dll");   
  36.   
  37.     if(DLLInst)   
  38.   
  39.     {   
  40.   
  41.         ptimeSetEvent = (MMRESULT (WINAPI *)(UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent))GetProcAddress(DLLInst, "timeSetEvent");   
  42.   
  43.         if(!ptimeSetEvent) return false;   
  44.   
  45.         ptimeKillEvent = (MMRESULT (WINAPI *)(UINT uTimerID))GetProcAddress(DLLInst, "timeKillEvent");   
  46.   
  47.         if(!ptimeKillEvent) return false;   
  48.   
  49.         return true;   
  50.   
  51.     }   
  52.   
  53.     return false;   
  54.   
  55. }   
  56.   
  57.   
  58.   
  59. void Byte2Human(const DWORD & byte)   
  60.   
  61. {   
  62.   
  63.     if(byte < 1024){   
  64.   
  65.         cout << ((float)((int)(byte*100+0.5))/100.0) << "B";   
  66.   
  67.         return;   
  68.   
  69.     }   
  70.   
  71.     float kb = byte/1024;   
  72.   
  73.     if (kb<1024){   
  74.   
  75.         cout << ((float)((int)(kb*100+0.5))/100.0) << "KB";   
  76.   
  77.         return ;   
  78.   
  79.     }   
  80.   
  81.     float mb = kb/1024;   
  82.   
  83.     if (mb<1024){   
  84.   
  85.         cout << ((float)((int)(mb*100+0.5))/100.0) << "MB";   
  86.   
  87.         return;   
  88.   
  89.     }   
  90.   
  91.     float gb = mb/1024;   
  92.   
  93.     cout << ((float)((int)(gb*100+0.5))/100.0) << "GB";   
  94.   
  95. }   
  96.   
  97.   
  98.   
  99. void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)   
  100.   
  101. {   
  102.   
  103.     DWSpeed = FinishSize-OldFinish;   
  104.   
  105.     OldFinish = FinishSize;   
  106.   
  107.     cout << '/r';   
  108.   
  109.     cout << "                                                                              ";   
  110.   
  111.     cout << '/r';   
  112.   
  113.     cout << "已接收 " << FinishSize << " ";   
  114.   
  115.     Byte2Human(DWSpeed);   
  116.   
  117.     cout << "/S";   
  118.   
  119. }   
  120.   
  121.   
  122.   
  123. int main(int argc, char* argv[])   
  124.   
  125. {   
  126.   
  127.     if(!init())   
  128.   
  129.     {   
  130.   
  131.         cout<<"初始化失败"<<endl;   
  132.   
  133.         return 0;   
  134.   
  135.     }   
  136.   
  137.   
  138.   
  139.     int ret;   
  140.   
  141.     if(argc < 3)   
  142.   
  143.     {   
  144.   
  145.         cout << "App.exe Port NewFileName" << endl;   
  146.   
  147.         return 0;   
  148.   
  149.     }   
  150.   
  151.   
  152.   
  153.     HANDLE hFile;   
  154.   
  155.     OFSTRUCT ofs;   
  156.   
  157.     HANDLE hMap;   
  158.   
  159.     void *pVoid;   
  160.   
  161.     hFile=(HANDLE)OpenFile(argv[2], &ofs, OF_CREATE | OF_READ);   
  162.   
  163.     if((HFILE)hFile==HFILE_ERROR)   
  164.   
  165.     {   
  166.   
  167.         cout << "打开文件失败";   
  168.   
  169.         ret = GetLastError();   
  170.   
  171.         cout << " ErrorCode=" << ret << endl;   
  172.   
  173.         return 0;   
  174.   
  175.     }   
  176.   
  177.   
  178.   
  179.     if((ret=WSAStartup(0x0202, &wsaData))!=0)   
  180.   
  181.     {   
  182.   
  183.         cout << "WSAStartup Failed!! Code:" << ret << endl;   
  184.   
  185.         return 0;   
  186.   
  187.     }   
  188.   
  189.   
  190.   
  191.     SOCKET sock, ssock;   
  192.   
  193.     struct sockaddr_in fsin, sin;   
  194.   
  195.     int alen;   
  196.   
  197.   
  198.   
  199.     memset(&sin, 0, sizeof(sin));   
  200.   
  201.     sin.sin_family=AF_INET;   
  202.   
  203.     sin.sin_addr.s_addr=inet_addr("");   
  204.   
  205.     sin.sin_port=htons(atoi(argv[1]));   
  206.   
  207.     sock=socket(PF_INET, SOCK_STREAM, 0);   
  208.   
  209.     if(sock==INVALID_SOCKET)   
  210.   
  211.     {   
  212.   
  213.         cout << "创建socket出错" << endl;   
  214.   
  215.         return 0;   
  216.   
  217.     }   
  218.   
  219.     if(bind(sock, (struct sockaddr*)&sin, sizeof(sin))==SOCKET_ERROR)   
  220.   
  221.     {   
  222.   
  223.         cout << "帮定Socket失败" << endl;   
  224.   
  225.         return 0;   
  226.   
  227.     }   
  228.   
  229.     if(listen(sock, SOMAXCONN)==SOCKET_ERROR)   
  230.   
  231.     {   
  232.   
  233.         cout << "监听失败" << endl;   
  234.   
  235.         return 0;   
  236.   
  237.     }   
  238.   
  239.     cout << "正在监听... 端口" << argv[1] << endl;   
  240.   
  241.     alen=sizeof(struct sockaddr);   
  242.   
  243.     ssock=accept(sock, (struct sockaddr *)&fsin, &alen);   
  244.   
  245.     if(ssock==INVALID_SOCKET)   
  246.   
  247.     {   
  248.   
  249.         cout << "接受请求失败" << endl;   
  250.   
  251.         return 0;   
  252.   
  253.     }   
  254.   
  255.     closesocket(sock);   
  256.   
  257.     char buf[4096];   
  258.   
  259.     DWORD dwWrite;   
  260.   
  261.     cout << "连接已建立" << endl;   
  262.   
  263.     uTimerID=ptimeSetEvent(1000, 0, (LPTIMECALLBACK)TimeProc, NULL, TIME_PERIODIC|TIME_CALLBACK_FUNCTION);   
  264.   
  265.   
  266.   
  267.     while(1)   
  268.   
  269.     {   
  270.   
  271.         memset(buf, 0x00, 4096);   
  272.   
  273.         ret = recv(ssock, buf, 4096, 0);   
  274.   
  275.         if(ret == SOCKET_ERROR )   
  276.   
  277.         {   
  278.   
  279.             cout << endl << "接收数据量:" << FinishSize << endl;   
  280.   
  281.             cout << "Ret=" << ret;   
  282.   
  283.             ret = WSAGetLastError();   
  284.   
  285.             cout << " ErrorCode=" << ret << endl;   
  286.   
  287.             return 0;   
  288.   
  289.         }   
  290.   
  291.         if(ret == 0)   
  292.   
  293.         {   
  294.   
  295.             cout << endl << "连接已断开" << endl;   
  296.   
  297.             break;   
  298.   
  299.         }   
  300.   
  301.         FinishSize += ret;   
  302.   
  303.         if(!WriteFile(hFile, buf, ret, &dwWrite, NULL))   
  304.   
  305.         {   
  306.   
  307.             cout << "写文件失败" << endl;   
  308.   
  309.             return 0;   
  310.   
  311.         }   
  312.   
  313.   
  314.   
  315.     }   
  316.   
  317.     ptimeKillEvent(uTimerID);   
  318.   
  319.     closesocket(sock);   
  320.   
  321.     CloseHandle(hFile);   
  322.   
  323.     cout << endl;   
  324.   
  325.     cout << "完成 接收数据量:" << FinishSize << endl;   
  326.   
  327.     return 0;   
  328.   
  329. }   
  330.   
  331. //---------------------------------------------------------------------------  

你可能感兴趣的:(socket,tcp,null,float,byte,winapi)