commCPU_SUPV/code/general/inc/general_socket.h
2025-04-30 16:24:29 +08:00

248 lines
7.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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类connectlistenrecvconnect
/**** 收到的连接属性 ****/ //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