原创软件 编程技术 驱动设计 汇编与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”);

 



 

 
 
友情连接
罗云彬编程乐园 AoGo汇编小站 老罗缤纷天地 水色银光 破解勇
80x86汇编小站 SmallWaves Hume的Asm ASM教程下载 X86汇编语言
一块三毛钱 惊涛之帆工作室 CVC(病毒木马) 看雪学院 笨冬瓜
HMX HOME NCPH官方 强档LINUX L4FDYOS sunwear的blog
安全焦点 未雨绸缪 雷雨、白云、hurk 极端的混混 D哥博客
赛迪网网络安全 红狼安全小组 岁月联盟 雄鹰基地 MILWORM
FRSIRT 驱动开发网 CZY CCG论坛 HNC网络联盟

欢迎加入CNASM站群QQ联盟

本站LOGO

音乐欣赏

管理登陆

email:whg0001⊙163.com QQ:312016 无花果-编程驿站 copyright 1999-2005 all rights reserved.

蜀ICP备05016108(四川★成都)欢迎与我合作