以下是二次开发接口(VTCP.H):#pragma once//////////
//设置函数操作名vctp_setsockopt(optname)
//////////#define VTCP_OPTNAME_NONBIO 0//设置非阻塞(BOOL*)
#define VTCP_OPTNAME_PACKET 1//设置包参数(SVTcpOptPacket)
#define VTCP_OPTNAME_KEEPALIVE 2//设置活动检测时间(SVTcpOptKeepAlive)
#define VTCP_OPTNAME_RECV_TIMEO 3//设置接收超时(int*)(ms)
#define VTCP_OPTNAME_SEND_TIMEO 4//设置发送超时(int*)(ms)
#define VTCP_OPTNAME_CONNECT_TIMO 5//设置连接超时(int*)(ms)
//////////
//数据结构
//////////typedef struct SVTcpOptPacket
{
WORD packet_data_size;//单包最大大小(UDP包的最大大小)(字节)
WORD packet_count;//包缓存数量(UDP包的缓存大小)}VTCP_OPT_PACKET,*PVTCP_OPT_PACKET;typedef struct SVTcpOptKeepAlive
{
int keep_alive;//保持活动超时(毫秒)
int keep_alive_interval;//保持活动时间间隔(毫秒)}VTCP_OPT_KEEPALIVE,*PVTCP_OPT_KEEPALIVE;typedef struct SVTcpStatCount
{
INT64 tcp_count_real_recv_data_bytes;
INT64 tcp_count_real_recv_data_bytes_micro;
INT64 tcp_count_real_send_data_bytes;
INT64 tcp_count_real_send_data_bytes_micro;INT64 tcp_count_recv_data;
INT64 tcp_count_recv_data_ack;
INT64 tcp_count_recv_data_drop;
INT64 tcp_count_recv_sync;
INT64 tcp_count_recv_sync_ack;
INT64 tcp_count_send_data;
INT64 tcp_count_send_data_micro;
INT64 tcp_count_send_data_micro_prv;
INT64 tcp_count_send_data_ack;
INT64 tcp_count_send_data_reps;
INT64 tcp_count_send_data_reps_micro;
INT64 tcp_count_send_data_reps_micro_prv;
INT64 tcp_count_send_sync;
INT64 tcp_count_send_sync_ack;int tcp_packet_reply;
int tcp_packet_ws_max;
int tcp_packet_ws;
int tcp_packet_data_size;int tcp_timeout_send;//阻塞模式发送超时
int tcp_timeout_recv;//阻塞模式接收超时
int tcp_keepalive_timeout;//活动超时间
int tcp_keepalive_timeout_dec;//活动超时间递减
int tcp_keepalive_interval;//活动间隔时间
int tcp_keepalive_interval_dec;////活动时间间隔递减DWORD tcp_sid;
DWORD tcp_sn_send;
DWORD tcp_sn_send_ws;
DWORD tcp_sn_recv;int tcp_list_count_recv_async;
int tcp_list_count_recv;
int tcp_list_count_send_async;
int tcp_list_count_send;DWORD tcp_sn_send_first;
DWORD tcp_sn_recv_first;}VTCP_STAT_COUNT,*PVTCP_STAT_COUNT;
//////////
//类型声明(API)
//////////
//无错误返回:ERROR_SUCCESS
//////////int WINAPI vtcp_startup(LPWSADATA wsad);
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_accept(int socket,int* sockaccept,PSOCKADDR_IN addr,int* addrlen);
int WINAPI vtcp_acceptex(int socket,int* sockaccept,PSOCKADDR_IN addr,int* addrlen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
int WINAPI vtcp_connect(int socket,PSOCKADDR_IN sai,int sailen);
int WINAPI vtcp_connectex(int socket,PSOCKADDR_IN sai,int sailen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
int WINAPI vtcp_send(int socket,PCHAR buf,int len,int flag,int* lpcb);
int WINAPI vtcp_sendex(int socket,PCHAR buf,int len,int flag,int* lpcb,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
int WINAPI vtcp_recv(int socket,PCHAR buf,int len,int flag,int* lpcb);
int WINAPI vtcp_recvex(int socket,PCHAR buf,int len,int flag,int* lpcb,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
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 lpcbTransfer,DWORD dwWait);
int WINAPI vtcp_getstatcount(int socket,SVTcpStatCount* tsc);
int WINAPI vtcp_close(int socket);
int WINAPI vtcp_cleanup();

解决方案 »

  1.   

    不至于吧:这么简单的,就改一下吧//½«ÒÔϳÌÐòдÈëinterfaceÖÐ
    //////////
    //ÉèÖú¯Êý²Ù×÷Ãûvctp_setsockopt(optname)
    //////////const VTCP_OPTNAME_NONBIO =0;//ÉèÖ÷Ç×èÈû(BOOL*)
    const VTCP_OPTNAME_PACKET =1;//ÉèÖðü²ÎÊý(SVTcpOptPacket)
    const VTCP_OPTNAME_KEEPALIVE= 2;//ÉèÖû¼ì²âʱ¼ä(SVTcpOptKeepAlive)
    const VTCP_OPTNAME_RECV_TIMEO= 3;//ÉèÖýÓÊÕ³¬Ê±(int*)(ms)
    const VTCP_OPTNAME_SEND_TIMEO =4;//ÉèÖ÷¢Ëͳ¬Ê±(int*)(ms) 
    const VTCP_OPTNAME_CONNECT_TIMO =5;//ÉèÖÃÁ¬½Ó³¬Ê±(int*)(ms)
    ////////// 
    //Êý¾Ý½á¹¹ 
    ////////// 
    type
    SVTcpOptPacket =record  
        packet_data_size:WORD ;//µ¥°ü×î´ó´óС(UDP°üµÄ×î´ó´óС)(×Ö½Ú) 
        packet_count: WORD;//°ü»º´æÊýÁ¿(UDP°üµÄ»º´æ´óС)
    end;
    VTCP_OPT_PACKET=SVTcpOptPacket ;
    PVTCP_OPT_PACKET =^PVTCP_OPT_PACKET; SVTcpOptKeepAlive =record keep_alive:integer;//±£³Ö»î¶¯³¬Ê±(ºÁÃë)
     keep_alive_interval:integer;//±£³Ö»î¶¯Ê±¼ä¼ä¸ô(ºÁÃë) 
    end;
    VTCP_OPT_KEEPALIVE=SVTcpOptPacket;
    PVTCP_OPT_KEEPALIVE=^VTCP_OPT_KEEPALIVE; SVTcpStatCount =recordtcp_count_real_recv_data_bytes:INT64;
    tcp_count_real_recv_data_bytes_micro:INT64;
    tcp_count_real_send_data_bytes:INT64;
    tcp_count_real_send_data_bytes_micro:INT64;tcp_count_recv_data:INT64;
    tcp_count_recv_data_ack:INT64;
    tcp_count_recv_data_drop:INT64;
    tcp_count_recv_sync:INT64;
    tcp_count_recv_sync_ack:INT64;
    tcp_count_send_data:INT64;
    tcp_count_send_data_micro:INT64;
    tcp_count_send_data_micro_prv:INT64;
    tcp_count_send_data_ack:INT64;
    tcp_count_send_data_reps:INT64;
    tcp_count_send_data_reps_micro:INT64;
    tcp_count_send_data_reps_micro_prv:INT64;
    tcp_count_send_sync:INT64;
    tcp_count_send_sync_ack:INT64;tcp_packet_reply:integer;
    tcp_packet_ws_max:integer;
    tcp_packet_ws:integer;
    tcp_packet_data_size:integer;tcp_timeout_send:integer ;//×èÈûģʽ·¢Ëͳ¬Ê± 
    tcp_timeout_recv:integer ;//×èÈûģʽ½ÓÊÕ³¬Ê± 
    tcp_keepalive_timeout:integer ;//»î¶¯³¬Ê±¼ä 
    tcp_keepalive_timeout_dec:integer ;//»î¶¯³¬Ê±¼äµÝ¼õ
    tcp_keepalive_interval:integer ;//»î¶¯¼ä¸ôʱ¼ä 
    tcp_keepalive_interval_dec:integer ;////»î¶¯Ê±¼ä¼ä¸ôµÝ¼õ tcp_sid:DWORD;
    tcp_sn_send:DWORD;
    tcp_sn_send_ws:DWORD;
    tcp_sn_recv:DWORD;tcp_list_count_recv_async:integer;
    tcp_list_count_recv:integer;
    tcp_list_count_send_async:integer;
    tcp_list_count_send:integer;tcp_sn_send_first:DWORD;
    tcp_sn_recv_first:DWORD;end;
    VTCP_STAT_COUNT= SVTcpStatCount ;
    PVTCP_STAT_COUNT=^VTCP_STAT_COUNT;
    //////////
    //ÀàÐÍÉùÃ÷(API)
    //////////
    //ÎÞ´íÎó·µ»Ø:ERROR_SUCCESS
    //////////function vtcp_startup(var wsad:WSADATA ):integer;stdcall;
    function vtcp_socket(var socket:integer;bserver:bool):integer;stdcall;
    function vtcp_bind(socket:integer;var sai:SOCKADDR_IN;sailen:integer):integer;stdcall;
    function  vtcp_listen(socket:integer;backlog:integer):integer;stdcall;
    function  vtcp_accept(socket:integer;var sockaccept:integer;var addr:SOCKADDR_IN;var addrlen:integer):integer;stdcall;
    function  vtcp_acceptex(socket:integer;var sockaccept:integer;var  addr:SOCKADDR_IN;var addrlen:integer;var lpOverlapped:OVERLAPPED;lpCompletionRoutine:TPROverlappedCompletionRoutine ):integer;stdcall;
    function  vtcp_connect(socket:integer;var sai:SOCKADDR_IN;sailen:integer):integer;stdcall;
    function  vtcp_connectex(socket:integer;var  sai:SOCKADDR_IN;sailen:integer;var lpOverlapped:OVERLAPPED; lpCompletionRoutine:TPROverlappedCompletionRoutine):integer;stdcall;
    function  vtcp_send(socket:integer;buf:PCHAR;len:integer;flag:integer;var lpcb:integer):integer;stdcall;
    function  vtcp_sendex(socket:integer;var  buf:PCHAR;len:integer;flag:integer;var lpcb:integer;var lpOverlapped:OVERLAPPED;lpCompletionRoutine:TPROverlappedCompletionRoutine):integer;stdcall;
    function  vtcp_recv(socket:integer;buf:PCHAR;len:integer;flag:integer;var lpcb:integer) :integer;stdcall;
    function  vtcp_recvex(socket:integer;buf:PCHAR;len:integer;flag:integer;var lpcb:integer;var  lpOverlapped:OVERLAPPED;lpCompletionRoutine:TPROverlappedCompletionRoutine):integer;stdcall;
    function  vtcp_setsockopt(socket:integer;optname:integer;optval:PCHAR;optlen:integer):integer;stdcall;
    function  vtcp_getpeername(socket:integer; var sai:SOCKADDR_IN;sailen:integer):integer;stdcall;
    function  vtcp_getsockname(socket:integer;var  sai:SOCKADDR_IN;sailen:integer):integer;stdcall;
    function  vtcp_getoverlapresult(socket:integer;var lpOverlapped:OVERLAPPED ;var lpcbTransfer:DWORD ; dwWait:DWORD):integer;stdcall;
    function  vtcp_getstatcount(socket:integer;var tsc:SVTcpStatCount) :integer;stdcall;
    function  vtcp_close(socket:integer) :integer;stdcall;
    function  vtcp_cleanup():integer;stdcall
    如果你有DLL,那可以在implementation中把函数重写一遍(直接将函数写在下面也可),并在所有函数后面加:
    external '你的DLL名.dll';
    如:
    function vtcp_startup(var wsad:WSADATA ):integer;stdcall;external 'mydll.dll';