#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