248 lines
7.0 KiB
C
248 lines
7.0 KiB
C
|
||
|
||
|
||
|
||
#ifndef GENERAL_SOCKET_123_INCLUDED
|
||
#define GENERAL_SOCKET_123_INCLUDED
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
/************************************************************************/
|
||
|
||
|
||
#include "glbtypes.h"
|
||
#include "gensock2.h"
|
||
|
||
|
||
/*****SOCET接收缓冲区的长度*****/
|
||
#define SOCKET_RECVBUF_LEN (12*1024)
|
||
|
||
/************************* 主动发起连接 *****************************/
|
||
/***不操作**/
|
||
#define SOCK_STATUS_CONNECT_NOTUSE 0
|
||
/***等待发起连接**/
|
||
#define SOCK_STATUS_CONNECT_WAIT 1
|
||
/***等待连接结果***/
|
||
#define SOCK_STATUS_CONNECT_ING 2
|
||
/***主动发起关闭,等待安全关闭***/
|
||
#define SOCK_STATUS_CONNECT_DIS 3
|
||
/***正常连接状态中***/
|
||
#define SOCK_STATUS_CONNECT_ED 4
|
||
|
||
|
||
/************************* 收到的连接 *****************************/
|
||
/*** 此处是空,等待填充 **/
|
||
#define SOCK_STATUS_RECV_WAIT 5
|
||
/***主动发起关闭,等待安全关闭***/
|
||
#define SOCK_STATUS_RECV_DIS 6
|
||
/***正常连接状态中***/
|
||
#define SOCK_STATUS_RECV_ED 7
|
||
|
||
|
||
/************************* 侦听的连接 *****************************/
|
||
/***不操作**/
|
||
#define SOCK_STATUS_LISN_NOTUSE 0
|
||
/*** 此处是空,等待填充 **/
|
||
#define SOCK_STATUS_LISN_WAIT 1
|
||
/*** 正常侦听中 ***/
|
||
#define SOCK_STATUS_LISN_ING 2
|
||
|
||
/************************* UDP连接 *****************************/
|
||
/***不操作**/
|
||
#define SOCK_STATUS_UDP_NOTUSE 0
|
||
/*** 此处是空,等待填充 **/
|
||
#define SOCK_STATUS_UDP_WAIT 1
|
||
/*** 正常侦听中 ***/
|
||
#define SOCK_STATUS_UDP_ING 2
|
||
|
||
|
||
/****连接超时间隔时间****/
|
||
#define SOCK_CONNECT_WAIT_TIME (10*1000)
|
||
/****发起连接等待时间,超时到关闭****/
|
||
#define SOCK_CONNECT_ING_TIME (30*1000)
|
||
/****主动关闭等待,超时强制关闭****/
|
||
#define SOCK_CONNECT_DIS_TIME (10*1000)
|
||
|
||
|
||
/**** 侦听失败,再次侦听 ****/
|
||
#define SOCK_LISTEN_WAIT_TIME (15*1000)
|
||
|
||
|
||
|
||
#ifdef WIN32
|
||
#define TYTX_SOCK_ESHUTDOWN WSAESHUTDOWN
|
||
#else
|
||
#define TYTX_SOCK_ESHUTDOWN ESHUTDOWN
|
||
#endif
|
||
|
||
|
||
typedef enum{
|
||
SOCKET_LINK_MODE_CONN=1,
|
||
SOCKET_LINK_MODE_RECV
|
||
} SOCKET_LINK_MODE;
|
||
|
||
|
||
/****SOCKET连接属性结构体****/
|
||
typedef struct
|
||
{
|
||
SOCKET_LINK_MODE sock_link_mode; //是主动发起的连接1,还是listen收到的连接2
|
||
|
||
SOCKET sockID; /***SOCKET**/
|
||
struct sockaddr_in IPaddr; /**连接对端属性**/
|
||
|
||
ST_INT status; /**当前连接属性**/
|
||
ST_DOUBLE operationTime; /**等待超时的时间**/
|
||
|
||
ST_INT lastSendLen;
|
||
ST_UINT recvCount; /**接收的帧数,累计*/
|
||
/***由于缓冲比较大,是否多连接共用缓冲,收到数据立刻处理?? ***/
|
||
ST_INT recvDataLen; /***接收到的数据长度**/
|
||
ST_UCHAR recvDataBuf[SOCKET_RECVBUF_LEN]; /**接收到的数据缓冲**/
|
||
|
||
//通知外部,收到连接
|
||
ST_INT flagConnecSuccess;
|
||
|
||
//下面的变量用于识别本SOCKET 对端的IP和端口
|
||
ST_CHAR ipaddress[32];
|
||
ST_INT tcpport;
|
||
} SOCKET_LINK_ATTRIB;
|
||
|
||
//socket分3类:connect,listen,recvconnect
|
||
/**** 收到的连接属性 ****/ //2011-10-26取消结构体,与CONN合并为LINK,由mode区分
|
||
// typedef struct
|
||
// {
|
||
// SOCKET sockID; /***SOCKET**/
|
||
// struct sockaddr_in IPaddr; /**连接对端属性**/
|
||
//
|
||
// ST_INT status; /**当前连接属性**/
|
||
// ST_DOUBLE operationTime; /**等待超时的时间**/
|
||
//
|
||
// ST_UINT recvCount; /**接收的帧数,累计*/
|
||
//
|
||
// /***由于缓冲比较大,是否多连接共用缓冲,收到数据立刻处理?? ***/
|
||
// ST_INT recvDataLen; /***接收到的数据长度**/
|
||
// ST_UCHAR recvDataBuf[SOCKET_RECVBUF_LEN]; /**接收到的数据缓冲**/
|
||
//
|
||
// //通知外部,收到连接
|
||
// ST_INT flagConnecSuccess;
|
||
//
|
||
// //下面的变量用于识别本SOCKET
|
||
// ST_CHAR ipaddress[32];
|
||
// ST_INT tcpport;
|
||
// } SOCKET_RECV_ATTRIB;
|
||
|
||
|
||
/**** 建立侦听连接 *****/
|
||
typedef struct
|
||
{
|
||
SOCKET sockID; /***SOCKET**/
|
||
struct sockaddr_in IPaddr; /**本地连接属性**/
|
||
|
||
ST_INT status; /**当前侦听属性**/
|
||
ST_DOUBLE operationTime; /** 超时时间到后,启动侦听**/
|
||
|
||
|
||
/*** 由本侦听连接,收到的连接 ***/
|
||
ST_INT maxConnNum; /*** 下面的指针,指向的个数长度 **/
|
||
SOCKET_LINK_ATTRIB *recvConnAttrib; /** 收到的连接 **/
|
||
|
||
|
||
//下面的变量用于识别本SOCKET
|
||
ST_CHAR ipaddress[32];
|
||
ST_INT tcpport;
|
||
} SOCKET_LISN_ATTRIB;
|
||
|
||
|
||
/*** UDP连接属性 ***/
|
||
typedef struct
|
||
{
|
||
SOCKET sockID; /***SOCKET**/
|
||
struct sockaddr_in localAddr; /**本地连接属性(这个属性可能缺失)**/
|
||
|
||
ST_INT status; /**当前侦听属性 0未启动,1已启动,2用户已处理**/
|
||
ST_DOUBLE operationTime; /** 超时时间到后,启动侦听**/
|
||
|
||
struct sockaddr_in remoteAddr; /** 收到数据时,对方连接属性**/
|
||
ST_CHAR remoteIP[32]; //从上面的结构体中得到
|
||
ST_INT remotePort;
|
||
|
||
ST_UINT recvCount; /**接收的帧数,累计*/
|
||
|
||
ST_INT recvDataLen; /***接收到的数据长度**/
|
||
ST_UCHAR recvDataBuf[SOCKET_RECVBUF_LEN]; /**接收到的数据缓冲**/
|
||
|
||
|
||
//下面的变量用于识别本SOCKET
|
||
ST_CHAR ipaddress[32]; //长度可能是0
|
||
ST_INT udpport;
|
||
ST_INT ifRemote; //是否使能路由,只有在本地广播包,才不使能
|
||
|
||
//以下为网口属性--从接口配置库读取
|
||
//cbt add 2021.1.8 使用eth2发送/接收故障测距的UDP报文--eth2需要具备mac、ip、掩码、网关
|
||
ST_CHAR ipmask[32]; //长度可能是0
|
||
ST_CHAR macaddress[32];
|
||
ST_CHAR gateway[32];
|
||
|
||
} SOCKET_UDP_ATTRIB;
|
||
|
||
|
||
/***作用: 发送缓冲内容,判断全部拷贝到发送缓冲*****/
|
||
ST_RET socket_link_send( SOCKET_LINK_ATTRIB * sock_attrib, ST_UCHAR *sendBuf, ST_INT dataLen );
|
||
/*作用: 主动关闭正常的连接*****/
|
||
ST_RET socket_link_close_active( SOCKET_LINK_ATTRIB * sock_attrib );
|
||
/*作用: 检查SOCKET是否收到数据、存在异常、收到关闭连接等*****/
|
||
ST_INT socket_link_check_status( SOCKET_LINK_ATTRIB * sock_attrib_array, ST_INT arrayNum );
|
||
|
||
|
||
/****作用:初始化结构体**/
|
||
ST_RET init_sock_conn_attrib( SOCKET_LINK_ATTRIB * sock_attrib );
|
||
|
||
ST_RET release_sock_conn_attrib( SOCKET_LINK_ATTRIB * sock_attrib );
|
||
|
||
|
||
/****作用:初始化 收到的连接 结构体**/
|
||
ST_RET init_sock_recv_attrib( SOCKET_LINK_ATTRIB * sock_attrib );
|
||
|
||
ST_RET release_sock_recv_attrib( SOCKET_LINK_ATTRIB * sock_attrib );
|
||
|
||
|
||
/****作用:初始化 建立侦听的 结构体**/
|
||
ST_RET init_sock_lisn_attrib( SOCKET_LISN_ATTRIB * sock_attrib );
|
||
|
||
ST_RET release_sock_lisn_attrib( SOCKET_LISN_ATTRIB * sock_attrib );
|
||
|
||
/***设置内容***/
|
||
ST_RET set_sock_lisn_attrib( SOCKET_LISN_ATTRIB * sock_attrib, ST_CHAR *ip_address, ST_INT port,
|
||
ST_DOUBLE listen_after_ms, ST_INT maxConnNum, SOCKET_LINK_ATTRIB * link_attrib );
|
||
ST_RET set_sock_conn_attrib( SOCKET_LINK_ATTRIB * sock_attrib, ST_CHAR *ip_address, ST_INT port,
|
||
ST_DOUBLE connect_after_ms );
|
||
|
||
/*作用: 检查SOCKET是否收到数据、存在异常、收到关闭连接等*****/
|
||
ST_INT socket_listen_check_status( SOCKET_LISN_ATTRIB * sock_attrib );
|
||
|
||
|
||
/******作用:初始化 UDP连接 结构体 ********/
|
||
ST_RET init_sock_udp_attrib( SOCKET_UDP_ATTRIB * sock_attrib );
|
||
ST_RET release_sock_udp_attrib( SOCKET_UDP_ATTRIB * sock_attrib );
|
||
|
||
/***作用:设置UDP连接相关属性,IP可以为空****/
|
||
ST_RET set_sock_udp_attrib( SOCKET_UDP_ATTRIB * sock_attrib, ST_CHAR *ip_address, ST_INT port,
|
||
ST_DOUBLE listen_after_ms, ST_INT ifRemote );
|
||
|
||
/*****作用:发送UDP数据帧(如果对端IP为空,向最后一次数据的连接发送)*****/
|
||
ST_RET socket_udp_send( SOCKET_UDP_ATTRIB * sock_attrib, ST_UCHAR *sendBuf, ST_INT dataLen, ST_CHAR *remoteIP, ST_INT remotePort );
|
||
/***作用: 检查UDP是否收到数据、存在异常等*****/
|
||
ST_INT socket_udp_check_status( SOCKET_UDP_ATTRIB * sock_attrib_arrary, ST_INT arrayNum );
|
||
|
||
ST_INT socket_udp_check_status_eth2( SOCKET_UDP_ATTRIB * sock_attrib );
|
||
|
||
/************************************************************************/
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
|
||
#endif
|