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






 
友情连接
罗云彬编程乐园 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(四川★成都)欢迎与我合作