![]() |
| 原创软件 | 编程技术 | 驱动设计 | 汇编与C | 加密解密 | 系统研究 | 胡乱收集 | 进化灵魂 | 共享资源 |
|
| 当前位置:首页> 编程技术> VC++UDP实现可靠传输(文件)(虚拟TCP2.0) |
VC++UDP实现可靠传输(文件)(虚拟TCP2.0)(点击:1264) |
|
下载VTCP 系统SDK: http://www.cnasm.com/down/vtcp20.rar
在不考虑可靠性传输(允许掉包)的情况下, 我们测试UDP本地网络的速度与相关参数的对比如下: /////////////////////////////////////////////////////////////////////////// //本地网络正常实验结果(T1-1) ////////////////////////////////////////////////////////////////////////// //包大小 | 速度           |  网络利用率  |    CPU占有率 |  调包率 //1KB    | 751-751KB      |  07%         |    14-15%    |  0 //4KB    | 3000-3008KB    |  25%         |    13-14%    |  0 //8KB    | 6000-6016KB    |  50%         |    15-17%    |  0 //16KB   | 6000-6016KB    |  50%         |    8-9%      |  0 //32KB   | 8000-8032KB    |  70%         |    6-8%      |  0 //48KB   | 8976-9024KB    |  80%         |    6-8%      |  0 //60KB   | 9000-9060KB    |  80%         |    6-8%      |  0 ////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// //本地网络极限实验结果(T1-2) ////////////////////////////////////////////////////////////////////////// //包大小 | 速度           |  网络利用率  |    CPU占有率 |  调包率 //1KB    | 2784-2792KB    |  100%        |    44-54%    |  50% //4KB    | 8864-9004KB    |  50%         |    100%      |  50% //8KB    | 11680-11704KB  |  100%        |    28-29%    |  0 //16KB   | 11696-11712KB  |  100%        |    13-15%    |  0 //32KB   | 11712-11744KB  |  100%        |    7-11%     |  0 //48KB   | 11712-11808KB  |  100%        |    7-10%     |  0 //60KB   | 7800-8100KB    |  100%        |    4-8%      |  50% ////////////////////////////////////////////////////////////////////////// VTCP2.0在考虑了网络速度与保证可靠性传输前提下,不再使用TCP协议算法。 采用针对UDP包具体特点,我们使用UDP独特的慢启动算法与UDP独特的拥塞算法, 实现了UDP可靠传输极限,10MB 局网速度可达11MB,几乎可以发挥整个局网的最大浅能。 而对于INTERNET网络,VTCP可靠传输的能力与真实TCP差不多。 VTCP2.0 API 更加稳定可靠,并且使用方便,所有API都返回错误代码。 VTCP2.0 API 目前支持异步完成例程模式,异步重叠IO模式,阻塞模式,三种。 vtcp_connectEx,支持异步连接,vtcp_setsockopt,可支持连接超时等。 vtcp_acceptEx,支持异步接受,这个是winsock2 没有的功能。 VTCP2.0 API 列表(使用手册请下载http://www.cnasm.com/down/vtcp20.rar) int WINAPI vtcp_startup(); int WINAPI vtcp_cleanup(); int WINAPI vtcp_socket(int* socket,BOOL bserver); int WINAPI vtcp_bind(int socket,PSOCKADDR_IN sai,int sailen); int WINAPI vtcp_listen(int socket,int backlog); int WINAPI vtcp_acceptEx(int socket,int* sockaccept,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); int WINAPI vtcp_accept(int socket,int* sockaccept); int WINAPI vtcp_connectEx(int socket,PSOCKADDR_IN sai,int sailen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); int WINAPI vtcp_connect(int socket,PSOCKADDR_IN sai,int sailen); int WINAPI vtcp_sendEx(int socket,PCHAR buf,int len,int flag,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); int WINAPI vtcp_send(int socket,PCHAR buf,int len,int flag,int* lpcb); int WINAPI vtcp_recvEx(int socket,PCHAR buf,int len,int flag,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); int WINAPI vtcp_recv(int socket,PCHAR buf,int len,int flag,int* lpcb); int WINAPI vtcp_shutdown(int socket); int WINAPI vtcp_close(int socket); int WINAPI vtcp_setsockopt(int socket,int optname,PCHAR optval,int optlen); int WINAPI vtcp_getpeername(int socket,PSOCKADDR_IN sai,int sailen); int WINAPI vtcp_getsockname(int socket,PSOCKADDR_IN sai,int sailen); int WINAPI vtcp_getoverlapresult(int socket,LPWSAOVERLAPPED lpOverlapped,LPDWORD lpError,LPDWORD lpcbTransfer,DWORD dwWait); int WINAPI vtcp_getdropcount(int socket,INT64* lpdrop,INT64* lpcome); 客户端样本   int main(int argc, char* argv[]) { if(int ercode=vtcp_startup())        {               printf("vtcp_startup=%d\r\n",ercode); return 0;        }          int s;        if(vtcp_socket(&s,FALSE))        {               printf("vtcp_socket\r\n");               return 0;        }          SOCKADDR_IN sai;        sai.sin_family=AF_INET;        sai.sin_addr.S_un.S_addr=0;        sai.sin_port=0;          if(vtcp_bind(s,&sai,sizeof(sai)))        {               printf("vtcp_bind\r\n");               vtcp_close(s);               return 0;        }          PHOSTENT ph=gethostbyname(“www.cnasm.com”);        if(NULL==ph)        {               printf("gethostbyname\r\n");               vtcp_close(s);               return 0;        }          sai.sin_family=AF_INET;        sai.sin_addr.S_un.S_addr=*LPDWORD(ph->h_addr_list[0]);        sai.sin_port=htons( 5000);          printf("connect...\r\n");          if(int ercode=vtcp_connect(s,&sai,sizeof(sai)))        {               printf("vtcp_connect=%d\r\n",ercode);               vtcp_close(s);               return 0;        }        //vtcp_send(…) //vtcp_recv(…)          printf("connect ok!\r\n");   vtcp_close(s); vtcp_cleanup();   return 0; }     服务器样本(多线程模式)   ULONG WINAPI TA(LPVOID p) {        int s=int(p);          //vtcp_recv(…) //vtcp_send(…)          vtcp_close(s);        return 0; }     int main(int argc, char* argv[]) { if(int ercode=vtcp_startup())        {               printf("vtcp_startup=%d\r\n",ercode); return 0;        }                 SOCKADDR_IN sai;        sai.sin_family=AF_INET;        sai.sin_addr.S_un.S_addr=0;        sai.sin_port=htons(5000);          int s;          if(int ercode=vtcp_socket(&s,TRUE))        {               printf("vtcp_socket=%d\r\n",ercode);               return 0;        }          if(int ercode=vtcp_bind(s,&sai,sizeof(sai)))        {               printf("vtcp_bind=%d\r\n",ercode);               vtcp_close(s);               return 0;        }          if(int ercode=vtcp_listen(s,5))        {               printf("vtcp_listen=%d\r\n",ercode);               vtcp_close(s);               return 0;        }          printf("listen success...\r\n");          while(true)        {               int as=0;               if(int ercode=vtcp_accept(s,&as))               {                      printf("vtcp_accept=%d\r\n",ercode);                      continue;               }                 DWORD dwtid;               CloseHandle(CreateThread(NULL,0,TA,LPVOID(as),0,&dwtid));               printf("accept success...\r\n");          }          vtcp_close(s);        vtcp_cleanup();        return 0; }     自定义超时连接样本片段(异步重叠IO)   …   WSAOVERLAPPED overlap={0}; overlap.hevent=CreateEvent(NULL,FALSE,FALSE,NULL);   if(vtcp_connect(s,&sai,sailen,&overlap,NULL) { CloseHandle(overlap.hevnet); retrun FALSE: }   DWORD dwError; DWORD dwSize; if(vtcp_getoverlapresult(s,&overlap,&dwError,&dwSize,1000*10)//10秒超时 { CloseHandle(overlap.hevnet); return FALSE: }   if(!dwError)//有错误 { CloseHandle(overlap.hevnet);              return FALSE; }   CloseHandle(overlap.hevnet);   printf(“connect ok\r\n”);   …     |
| 友情连接 |
本站LOGO |
管理登陆 |
email:whg0001⊙163.com QQ:312016 无花果-编程驿站 copyright 1999-2005 all rights reserved. |
蜀ICP备05016108(四川★成都)欢迎与我合作 |
|