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

相關詞條

熱門詞條

聯絡我們