新闻资讯
看你所看,想你所想

VTCP

VTCP

VTCP是虚拟TCP协定缩写,它实现了UDP可靠传输,

基本介绍

  • 中文名:VTCP
  • 解释:虚拟TCP协定缩写
  • 实现:UDP可靠传输
  • 支持开发语言:C++,Pas(delphi)等

简介

UDP本来是一种不可靠的网路协定,但在有些情况下UDP协定可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。因此我们设计出了一种新的可靠UDP协定(VTCP),自动实现UDP数据传输的可靠性。该项目始于2010年,在5年多的研製时间里,提出摆动G点理论水桶理论,不断进化与提高,VTCP有着显着的速度与实时性能,是製作视频传输,音频传输,IM通讯,档案传输极好的选择。

构架

VTCP 14.01 已发展为跨平台构架
支持系统如下
windows
mac
linux/unix
andriod
VTCP QIO 模型可以构建高性能的伺服器和客户器

什幺是QIO,Q可以理解为 Quick(快速),也可以理解 Queue(伫列),实际上其原理就是一个快速的任务伫列操作,内部包涵高效的执行绪池任务分配代码,可以把VTCP内部事件快速的分配给套用层的执行绪池进行并行的处理。
QIO的优点,QIO吸收了ICOP+EPOLL双重优点;他像 EPOLL 接口一样,首先要套用层提交关心的事件,然后再像 IOCP 一样利用用户执行绪池从伫列里取出1个事件来处理。执行绪池循环的取事件,处理事件,周而复始;QIO允许用户像IOCP一样,给执行绪池投递自定义事件。
QIO使用步骤
第一步:创建出VTCP_QIO_HANDLE,通过vtcp_qio_create()函式。
第二步:创建出N个用户执行绪池,循环调用vtcp_qio_get(...)取事件,然后更具事件类型去处理。
第三步:创建出VTCP_HANDLE,通过vtcp_socket/vtcp_socketshare,设定句柄为非阻塞模式,进行监听或者连线。
第四部:关联VTCP_HANDLE事件到VTCP_QIO_HANDLE上通过vtcp_qio_set(...)。
总共四步,就创建出了高性能的伺服器与客户器。
QIO支持连线可高达60000以上基本与理论设计目标65535个vtcp支持的最大句柄数量一致。
VTCP 3G/4G 视频传输最佳化
vtcp 为保证3G/4G网路中视频传输实时性能,设计了类似资源预留功能的协定,套用层通过vtcp_setsockopt函式设定VTCP_SO_RSVP结构SVTcpRSVP,该结构定义如下:
struct SVTcpRSVP
{
unsigned long rsvp_min; //KB/s
unsigned long rsvp_max; //KB/s
};
rsvp_min: 设定为视频每秒产生数据的平均值估算。
rsvp_max: 设定为视频每秒产生数据的最高值估算,也可以设定为rsvp的N倍(推荐为3倍值)。
vtcp 就可以更具SVTcpRSVP设定在实时性与流量上选择一个最佳传输点,以获取最佳效果。
VTCP SDK 头档案
#ifndef VTCP_H
#define VTCP_H

#ifdef WIN32
#include <WinSock2.h>
#ifndef int64
typedef __int64 int64;
#endif
#ifndef socklen_t
#define socklen_t int
#endif
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#ifndef int64
typedef __int64_t int64;
#endif
#endif
#define VTCP_OK int(0)
#define VTCP_ERROR int(-1)
#define VTCP_INVALID_SOCKET int(-1)
typedef int VTCP_SOCKET;
typedef void * VTCP_QIO_HANDLE;
struct SVTcpKeepAlive
{
unsigned long onoff;
unsigned long keepalivetime;
unsigned long keepaliveinterval;
};
struct SVTcpLinger
{
unsigned short l_onoff;
unsigned short l_linger;
};
struct SVTcpRSVP
{
unsigned long rsvp_min; //KB/s
unsigned long rsvp_max; //KB/s
};
enum EVTcpErrorCode
{
VTCP_ERROR_NOT_ENOUGH_MEMORY = 1, //记忆体不足
VTCP_ERROR_INVALID_PARAMETER = 2, //参数错误
VTCP_ERROR_INVALID_STATE = 3, //句柄状态错误
VTCP_ERROR_INVALID_SOCKET = 4, //句柄错误
VTCP_ERROR_TIMEOUT = 5, //操作逾时
VTCP_ERROR_WOULDBLOCK = 7, //异步阻挡
VTCP_ERROR_CONNRESET = 8, //远程关闭了连线
VTCP_ERROR_CONNABORTED = 9, //本地关闭了连线
VTCP_ERROR_CONNREFUSED = 10, //连线被积极拒绝
VTCP_ERROR_MSG_SIZE = 11, //讯息尺寸错误
VTCP_ERROR_CANCELLED = 12, //操作被取消
VTCP_ERROR_NOT_FOUND = 13, //对象未发现
VTCP_ERROR_BUSY = 14, //系统繁忙
VTCP_ERROR_SYSTEM_FAIL = 15, //系统调用失败
VTCP_ERROR_NETRESET = 16, //因保活检测失败而断线
};
enum EVTcpSoOpt
{
VTCP_SO_CONNECT_TIMEO = 1, //连线逾时(unsigned long)(毫秒)
VTCP_SO_RECV_TIMEO = 2, //接收逾时(unsigned long)(毫秒)
VTCP_SO_RECVFROM_TIMEO = 3, //接收逾时(unsigned long)(毫秒)
VTCP_SO_SEND_TIMEO = 4, //传送逾时(unsigned long)(毫秒)
VTCP_SO_SENDTO_TIMEO = 5, //传送逾时(unsigned long)(毫秒)
VTCP_SO_LINGER = 6, //逗留时间(SVTcpLinger)
VTCP_SO_KEEPALIVE = 7, //保活设定(SVTcpKeepAlive)
VTCP_SO_RSVP = 8, //资源预留(SVTcpRSVP)(视频传输)
VTCP_SO_STAT_COUNT = 9, //统计信息(SVTcpStatCount)
};
enum EVTcpQIOEvent
{
VTCP_QIO_EVENT_ACCEPT = 1, //兼容VTCP_QIO_EVENT_RECV
VTCP_QIO_EVENT_CONNECT = 2, //兼容VTCP_QIO_EVENT_SEND
VTCP_QIO_EVENT_RECV = 3,
VTCP_QIO_EVENT_RECVFROM = 4,
VTCP_QIO_EVENT_SEND = 5,
VTCP_QIO_EVENT_SENDTO = 6,
};
enum EVTcpCtl
{
VTCP_CTL_GET_NONBIO = 1,
VTCP_CTL_SET_NONBIO = 2,
};
#endif
//VTCP API 列表

#ifdef WIN32
#define VTCP_EXPORT_API(t) t WINAPI
#else
#define VTCP_EXPORT_API(t) extern "C" t
#endif
VTCP_EXPORT_API(VTCP_SOCKET )vtcp_accept (VTCP_SOCKET s, sockaddr * sai, socklen_t * sailen);
VTCP_EXPORT_API(int )vtcp_bind (VTCP_SOCKET s, const struct sockaddr * sai, socklen_t sailen);
VTCP_EXPORT_API(int )vtcp_cleanup ();
VTCP_EXPORT_API(int )vtcp_close (VTCP_SOCKET s);
VTCP_EXPORT_API(int )vtcp_connect (VTCP_SOCKET s, const struct sockaddr * sai, socklen_t sailen);
VTCP_EXPORT_API(int )vtcp_ctl (VTCP_SOCKET s, EVTcpCtl ctl,unsigned long * p);
VTCP_EXPORT_API(int )vtcp_geterror ();
VTCP_EXPORT_API(int )vtcp_getsockname (VTCP_SOCKET s, struct sockaddr * sai, socklen_t * sailen);
VTCP_EXPORT_API(int )vtcp_getpeername (VTCP_SOCKET s, struct sockaddr * sai, socklen_t * sailen);
VTCP_EXPORT_API(int )vtcp_listen (VTCP_SOCKET s, int backlog);
VTCP_EXPORT_API(int )vtcp_recv (VTCP_SOCKET s, char * buffer, int cb, int flag);
VTCP_EXPORT_API(int )vtcp_recvfrom (VTCP_SOCKET s, char * buffer, int cb, int flag, struct sockaddr * from, socklen_t * fromlen);
VTCP_EXPORT_API(int )vtcp_send (VTCP_SOCKET s, char * buffer, int cb, int flag);
VTCP_EXPORT_API(int )vtcp_sendto (VTCP_SOCKET s, char * buffer, int cb, int flag, const struct sockaddr * to, socklen_t tolen);
VTCP_EXPORT_API(int )vtcp_getsockopt (VTCP_SOCKET s, int level, int optname, char * optval, int * optlen);
VTCP_EXPORT_API(int )vtcp_setsockopt (VTCP_SOCKET s, int level, int optname, char * optval, int optlen);
VTCP_EXPORT_API(int )vtcp_select (SVTcpFdSet * fdr, SVTcpFdSet * fdw, SVTcpFdSet * fde, const struct timeval * to);
VTCP_EXPORT_API(VTCP_SOCKET )vtcp_socket (int af, int itype, int protocol);
VTCP_EXPORT_API(VTCP_SOCKET )vtcp_socketshare (VTCP_SOCKET s);
VTCP_EXPORT_API(int )vtcp_startup ();
VTCP_EXPORT_API(VTCP_QIO_HANDLE )vtcp_qio_create ();
VTCP_EXPORT_API(int )vtcp_qio_post (VTCP_QIO_HANDLE qio, VTCP_SOCKET s, EVTcpQIOEvent qio_event, void * qio_data, int qio_error);
VTCP_EXPORT_API(int )vtcp_qio_get (VTCP_QIO_HANDLE qio, VTCP_SOCKET * s, EVTcpQIOEvent * qio_event, void ** qio_data, int * qio_error, unsigned long timeout);
VTCP_EXPORT_API(int )vtcp_qio_set (VTCP_QIO_HANDLE qio, VTCP_SOCKET s, EVTcpQIOEvent qio_event, void * qio_data);
VTCP_EXPORT_API(int )vtcp_qio_close (VTCP_QIO_HANDLE qio);
//VTCP.H

相关推荐

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:yongganaa@126.com