![]() |
| 原创软件 | 编程技术 | 驱动设计 | 汇编与C | 加密解密 | 系统研究 | 胡乱收集 | 进化灵魂 | 共享资源 |
|
| 当前位置:首页> 编程技术> VC++UDP实现可靠传输(文件)(虚拟TCP3.0) |
VC++UDP实现可靠传输(文件)(虚拟TCP3.0)(点击:2395) |
|
关键词: 
使用UDP可靠传输。 使用UDP可靠文件传输。 使用UDP可靠传输协议RDUP协议。 使用UDP实现可靠文件传输。 使用UDP协议实现数据可靠传输。 基于UDP的可靠数据传输协议。 一种实现可靠UDP传输的拥塞控制方法。 相关技术: RUDP协议:可靠用户数据报协议(RUDP:Reliable UDP)。 UDT协议-基于UDP的可靠数据传输协议|UDT,协议,UDP,可靠,数据传输,协议。 UDP无差错传输文件或数据。 下载VTCP 系统SDK: http://www.cnasm.com/down/vtcp3.0sdk.rar VTCP3.0实现的UDP可靠传输算法简介 1. UDP包大小对传输速度-效率的影响关系图如下表(局网条件) ////////////////////////////////////////////////////////////////////////// //包大小 | 速度           |  网络利用率  |    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  ////////////////////////////////////////////////////////////////////////// 首先我们要解决的对包的大小的选择上,在局网条件下与广域网条件条件是是不同的,为了获取特定网络环境下的最佳速度,VTCP自动识别了网络环境,选择一个合适的包大小,用来传输数据。 2. 网络拥塞/掉包/重发的处理 网络拥塞含义可以查询相关TCP协议的描述,VTCP3.0采用了慢启动加速与拥塞控制算法,使得数据收发得到了平衡,实现了网络的极限传输率,对于丢包与重发控制上面,VTCP采用延迟检测法保证发送尽可能少的重复包,以提高传输效率,在理想的连续大量的传输数据下,丢包与重复包都尽可能的减到最少,特别是在广域网条件下,丢包无法预知,延迟检测丢包法显得更为优秀。 3. 关闭负载均衡 负载均衡的问题基本上都出现在同时具备多个连接的服务器上,VTCP采用的均分数据包,使得每一个与服务器连接的句柄上,传输数据得到均衡,保证了每一个连接的服务品质。比如说局网总带宽10MB/s,如果有存在n个连接,同时都再传输数据,则每个连接大致都可以获得10MB/n传输速度。 4. 支持模式上的考虑 目前VTCP支持阻塞,异步重叠IO,异步完成例程三种网络编程模式,这三种模式与真实TCP编程没有区别,只是在函数名字,参数与返回值上面与winsock稍微不同,有经验的程序员可以使用异步完成例程模式模拟出异步消息模式。VTCP目前暂时不直接支持异步消息模式。 如果你在使用中发现了BUG,请EMAIL给我: whg0001@163.com. int WINAPI vtcp_startup(); 说明:  启动VTCP网络服务。 参数:  无 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_cleanup() 说明:  关闭VTCP网络服务。 参数:  无 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_socket(int* socket,BOOL bserver); 说明:  创建VTCP SOCKET 句柄 参数:  socket: 输出VTCP SOCKET 句柄 bserver: 输入为TRUE创建可用于LISTEN的服务端,为FALSE创建可用于CONNECT的客户端。 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_bind(int socket,PSOCKADDR_IN sai,int sailen); 说明:  绑定一个本地地址给VTCP句柄 参数:  socket: 输入VTCP SOCKET 句柄 sai: 输入要绑定的地址结构 sailen: 输入绑定的地址结构大小 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_listen(int socket,int backlog); 说明:  监听端口 参数:  socket: 输入VTCP SOCKET 句柄 backlog: 输入监听对列大小 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_acceptEx(int socket,int* sockaccept,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); 说明:  支持异步重叠IO模式与异步完成例程的接受连接请求。 参数:  socket: 输入VTCP SOCKET 句柄 sockaccept: 输出接受到的VTCP SOCKET 句柄 lpOverlapped: 重叠结构,且不能为NULL。 lpCompletionRoutine: 完成例程,可以是NULL,如果为NULL,则WSAOVERLAPPED中hEvent成员必须设置。 当有可被接受的连接后,VTCP回调用这个函数 void CALLBACK CompletionROUTINE(   IN DWORD dwError, //VTCP_ERROR_...   IN DWORD cbTransferred, //=0   IN LPWSAOVERLAPPED lpOverlapped,    IN DWORD dwFlags//=0 ); 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_accept(int socket,int* sockaccept); 说明:  阻塞模式接受连接请求。 参数:  socket: 输入VTCP SOCKET 句柄 sockaccept: 输出接受到的VTCP SOCKET 句柄 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_connectEx(int socket,PSOCKADDR_IN sai,int sailen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); 说明:  支持异步重叠IO模式与异步完成例程的连接请求。 参数:  socket: 输入VTCP SOCKET 句柄 sai: 输入连接地址结构 sailen: 输入连接地址结构大小 lpOverlapped: 重叠结构,且不能为NULL。 lpCompletionRoutine: 完成例程,可以是NULL,如果为NULL,则WSAOVERLAPPED中hEvent成员必须设置。 当发生连接事件后,VTCP回调用这个函数 void CALLBACK CompletionROUTINE(   IN DWORD dwError, //VTCP_ERROR_...   IN DWORD cbTransferred, //=0   IN LPWSAOVERLAPPED lpOverlapped,    IN DWORD dwFlags//=0 ); 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_connect(int socket,PSOCKADDR_IN sai,int sailen); 说明:  阻塞模式连接请求。 参数:  socket: 输入VTCP SOCKET 句柄 sai: 输入连接地址结构 sailen: 输入连接地址结构大小 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_sendEx(int socket,PCHAR buf,int len,int flag,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); 说明:  支持异步重叠IO模式与异步完成例程的发送请求。 参数:  socket: 输入VTCP SOCKET 句柄 buf: 输入发送缓冲区地址 len: 输入发送缓冲区数据大小 flag: 输入必须为0 lpOverlapped: 重叠结构,且不能为NULL。 lpCompletionRoutine: 完成例程,可以是NULL,如果为NULL,则WSAOVERLAPPED中hEvent成员必须设置。 当发送完成后,VTCP回调用这个函数 void CALLBACK CompletionROUTINE(   IN DWORD dwError, //VTCP_ERROR_...   IN DWORD cbTransferred, //实际发送的字节数,如果无错误等于发送缓冲区数据大小   IN LPWSAOVERLAPPED lpOverlapped,    IN DWORD dwFlags//=0 ); 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_send(int socket,PCHAR buf,int len,int flag,int* lpcb) 说明:  阻塞模式发送请求。 参数:  socket: 输入VTCP SOCKET 句柄 buf: 输入发送缓冲区地址 len: 输入发送缓冲区数据大小 flag: 输入必须为0 lpcb: 输出实际发送字节数,如果无错误等于输入发送缓冲区数据大小。 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_recvEx(int socket,PCHAR buf,int len,int flag,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); 参考vtcp_sendEx ===================================================================== int WINAPI vtcp_recv(int socket,PCHAR buf,int len,int flag,int* lpcb); 参考vtcp_send ===================================================================== int WINAPI vtcp_close(int socket); 说明:  关闭VTCP SOCKET 句柄 参数:  socket: 输入VTCP SOCKET 句柄 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_setsockopt(int socket,int optname,PCHAR optval,int optlen); 说明:  设置VTCP SOCKET 内部参数 参数:  socket: 输入VTCP SOCKET 句柄 optname: 常量VTCP_OPTNAME_... optval: 数据地址,取决于optname,通常是结构VTCP_OPT_PACKET/VTCP_OPT_KEEPALIVE/VTCP_OPT_SEND_TIMEOUT/VTCP_OPT_RECV_TIMEOUT其中的一个结构地址 optlen: 结构大小,取决于optname 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_getpeername(int socket,PSOCKADDR_IN sai,int sailen); 参见winsock api getpeername ===================================================================== int WINAPI vtcp_getsockname(int socket,PSOCKADDR_IN sai,int sailen); 参见winsock api getsockname ===================================================================== int WINAPI vtcp_getoverlapresult(int socket,LPWSAOVERLAPPED lpOverlapped,LPDWORD lpError,LPDWORD lpcbTransfer,DWORD dwWait); 说明:  得到重叠IO结果 参数:  socket: 输入VTCP SOCKET 句柄 lpOverlapped: 输入 lpError: 输出错误代码VTCP_ERROR... lpcbTransfer: 输出传输字节数,如果是非传输IO,始终为0 dwWait: 等待时间(豪秒),0,不等待,INFINETE: 永久等待,直到IO完成。 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== int WINAPI vtcp_getdropcount(int socket,INT64* lpdrop,INT64* lpcome); 说明:  得到一个连接的VTCP SOCKET 丢包情况 参数:  socket: 输入VTCP SOCKET 句柄 lpdrop: 丢掉的包数量 lpcome: 总共到达的包数量 返回: 成功-ERROR_SUCCESS; 失败-其他错误代码! ===================================================================== 设置函数操作名vctp_setsockopt(…) #define VTCP_OPTNAME_PACKET 0//客户端连接前设置 #define VTCP_OPTNAME_KEEPALIVE 1//客户端连接前设置 #define VTCP_OPTNAME_RECV_TIMEOUT 2//连接后设置 #define VTCP_OPTNAME_SEND_TIMEOUT 3/连接后设置 数据结构 typedef struct SVTcpOptPacket { WORD packet_data_size;//单包最大大小(UDP包的最大大小)(字节) WORD packet_count;//包缓存数量(UDP包的缓存大小) }VTCP_OPT_PACKET,*PVTCP_OPT_PACKET; typedef struct SVTcpOptKeepAlive { DWORD keep_alive;//保持活动超时(毫秒) DWORD keep_alive_interval;//保持活动时间间隔(毫秒)(必须小于keep_alive) }VTCP_OPT_KEEPALIVE,*PVTCP_OPT_KEEPALIVE; typedef struct SVTcpOptSendTimeout { DWORD timeout;//单位毫秒 }VTCP_OPT_SEND_TIMEOUT,VTCP_OPT_RECV_TIMEOUT,*PVTCP_OPT_SEND_TIMEOUT,*PVTCP_OPT_RECV_TIMEOUT; 操作系统相关数据结构 void (CALLBACK* LPWSAOVERLAPPED_COMPLETION_ROUTINE)(   IN DWORD dwError,    IN DWORD cbTransferred,    IN LPWSAOVERLAPPED lpOverlapped,    IN DWORD dwFlags ); typedef struct _OVERLAPPED {     ULONG_PTR Internal;     ULONG_PTR InternalHigh;     union {         struct {             DWORD Offset;             DWORD OffsetHigh;         };         PVOID Pointer;     };     HANDLE  hEvent; } OVERLAPPED, *LPOVERLAPPED; #define WSAOVERLAPPED           OVERLAPPED typedef struct _OVERLAPPED *    LPWSAOVERLAPPED; 客户端样本 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(四川★成都)欢迎与我合作 |
|