📄 usrsocklib.c
字号:
/* 关闭套接字 */
shutdown( pconn->sock, 2 );
close( pconn->sock );
}
}
}
/* 删除连接表 */
mem_release( pserver->conn_list );
/* 撤消服务器 */
mem_delete( G_STL_ServerList, (hServer - 1) );
}
}
}
}
/* 函数功能: 重启一个服务器
* 参数说明:
* hServer[IN]: 服务器句柄
* 返回值:
* 启动成功则返回服务器句柄, 否则返回-1
*/
int STL_RestartServer( int hServer )
{
char ip_str[20];
STL_Server server;
if( STL_GetServer(hServer, &server) )
{
STL_CloseServer( hServer );
inet_ntoa_b( server.addr.sin_addr, ip_str );
return STL_OpenServer( server.name,
ip_str,
server.addr.sin_port,
server.max_conn,
server.bShareTask,
server.bAutoAccept,
server.bKeepAlive,
server.tIdelMax,
server.taskPriority,
server.taskStack,
server.callback );
}
return -1;
}
/* 函数功能: 接受连接请求
* 参数说明:
* hServer[IN]: 服务器句柄
* 返回值:
* 成功获取连接项则返回该连接的句柄, 否则返回-1
*/
int STL_Accept( int hServer )
{
STL_Server *pserver;
STL_Connection *pconn;
int i;
int ret = -1;
if( G_STL_RUN && hServer > 0 )
{
/* 获取服务器信息 */
pserver = (STL_Server*)mem_mapaddr( G_STL_ServerList, (hServer - 1) );
if( pserver )
{
if( pserver->state == STL_SERVER_STATE_NORMAL )
{
for( i = 0; i < pserver->max_conn; i++ )
{
/* 获取连接信息 */
pconn = (STL_Connection*)mem_mapaddr( pserver->conn_list, i );
if( pconn )
{
if( pconn->state.flag == STL_CONN_STATE_CONNECTED &&
!pconn->state.accepted )
{
pconn->state.accepted = TRUE;
pconn->state.flag = STL_CONN_STATE_NORMAL;
ret = STL_MAKE_CLIENT_HANDLE(hServer, i);
if( !pserver->bShareTask )
{
/* 启动客户连接处理任务 */
if( !usrTaskCreate(TASK_TYPE_STL_CLIENT,
ret,
0,
TASK_NAME_STL_CLIENT,
pserver->taskPriority + 1,
0,
pserver->taskStack,
(FUNCPTR)STL_ClientTask,
ret,
0) )
{
ret = -1;
}
}
if( ret == -1 )
{
/* 关闭套接字 */
shutdown( pconn->sock, 2 );
close( pconn->sock );
/* 删除连接 */
mem_delete( pserver->conn_list, i );
}
}/* if( pconn->state.flag == STL_CONN_STATE_CONNECTED ) */
}/* if( pconn ) */
}/* for( ... ) */
}
}
}
return ret;
}
/* 函数功能: 中断连接
* 参数说明:
* hConn[IN]: 连接句柄
*/
void STL_Abort( int hConn )
{
STL_Server *pserver;
STL_Connection *pconn;
if( G_STL_RUN && STL_GET_SERVER_HANDLE(hConn) > 0 )
{
/* 获取服务器信息 */
pserver = (STL_Server*)mem_mapaddr( G_STL_ServerList, (STL_GET_SERVER_HANDLE(hConn) - 1) );
if( pserver )
{
if( pserver->state == STL_SERVER_STATE_NORMAL )
{
/* 获取连接信息 */
pconn = (STL_Connection*)mem_mapaddr( pserver->conn_list, STL_GET_CLIENT_HANDLE(hConn) );
if( pconn )
{
if( pconn->state.flag != STL_CONN_STATE_INVALID )
{
if( !pserver->bShareTask )
{
/* 结束客户连接处理任务 */
pconn->state.flag = STL_CONN_STATE_ABORT;
usrTaskDelete( TASK_TYPE_STL_CLIENT,
hConn,
1000 );
}
/* 关闭套接字 */
shutdown( pconn->sock, 2 );
close( pconn->sock );
}
/* 删除连接 */
mem_delete( pserver->conn_list, STL_GET_CLIENT_HANDLE(hConn) );
}
}
}
}
}
/* 函数功能: 读取数据
* 参数说明:
* hConn[IN]: 连接句柄
* *in_buf[OUT]: 输入缓冲区
* int_buf_size[IN]: 输入缓冲区容量(byte)
* 返回值:
* 读取成功则返回实际读取的字节数(无数据则返回0), 出错则返回-1
*/
int STL_Read( int hConn,
void *in_buf,
int in_buf_size
)
{
STL_Server *pserver;
STL_Connection *pconn;
int ret = -1;
if( G_STL_RUN && STL_GET_SERVER_HANDLE(hConn) > 0 && in_buf && in_buf_size > 0 )
{
/* 获取服务器信息 */
pserver = (STL_Server*)mem_mapaddr( G_STL_ServerList, (STL_GET_SERVER_HANDLE(hConn) - 1) );
if( pserver )
{
if( pserver->state == STL_SERVER_STATE_NORMAL )
{
/* 获取连接信息 */
pconn = (STL_Connection*)mem_mapaddr( pserver->conn_list, STL_GET_CLIENT_HANDLE(hConn) );
if( pconn )
{
if( pconn->state.flag == STL_CONN_STATE_NORMAL )
{
/* 读取数据 */
ret = recv( pconn->sock, (char*)in_buf, in_buf_size, 0 );
}
}
}
}
}
return ret;
}
/* 函数功能: 发送数据
* 参数说明:
* hConn[IN]: 连接句柄
* *out_buf[IN]: 输出缓冲区
* out_buf_size[IN]: 输出缓冲区容量(byte)
* 返回值:
* 发送成功则返回TRUE, 否则返回FALSE
*/
BOOL STL_Write( int hConn,
void *out_buf,
int out_buf_size
)
{
STL_Server *pserver;
STL_Connection *pconn;
int snds = 0, total_snds = 0;
if( G_STL_RUN && STL_GET_SERVER_HANDLE(hConn) > 0 && out_buf && out_buf_size > 0 )
{
/* 获取服务器信息 */
pserver = (STL_Server*)mem_mapaddr( G_STL_ServerList, (STL_GET_SERVER_HANDLE(hConn) - 1) );
if( pserver )
{
if( pserver->state == STL_SERVER_STATE_NORMAL )
{
/* 获取连接信息 */
pconn = (STL_Connection*)mem_mapaddr( pserver->conn_list, STL_GET_CLIENT_HANDLE(hConn) );
if( pconn )
{
if( pconn->state.flag == STL_CONN_STATE_NORMAL )
{
while( total_snds < out_buf_size )
{
snds = send( pconn->sock,
(char*)out_buf + total_snds,
out_buf_size - total_snds,
0);
if( snds == SOCKET_ERROR )
{
break;
}
else
{
total_snds += snds;
}
}/* while */
}
}
}
}
return total_snds == out_buf_size;
}
return FALSE;
}
/* 函数功能: 广播即发送给所有连接者(不是UDP方式的广播)
* 参数说明:
* hServer[IN]: 服务器句柄
* *out_buf[IN]: 输出缓冲区
* out_buf_size[IN]: 输出缓冲区容量(byte)
*/
void STL_Broadcast( int hServer,
void *out_buf,
int out_buf_size
)
{
STL_Server *pserver;
int i;
if( G_STL_RUN && hServer > 0 )
{
/* 获取服务器信息 */
pserver = (STL_Server*)mem_mapaddr( G_STL_ServerList, (hServer - 1) );
if( pserver )
{
if( pserver->state == STL_SERVER_STATE_NORMAL )
{
for( i = 0; i < pserver->max_conn; i++ )
{
STL_Write( STL_MAKE_CLIENT_HANDLE(hServer, i), out_buf, out_buf_size );
}
}
}
}
}
/* 函数功能: ioctl
* 参数说明:
* 返回值:
*/
int STL_Ioctl( int hConn, int cmd, int arg )
{
STL_Server *pserver;
STL_Connection *pconn;
int ret = ERROR;
if( G_STL_RUN && cmd )
{
if( hConn & 0x00FFFFFF )
{
/* Client */
/* 获取服务器信息 */
pserver = (STL_Server*)mem_mapaddr( G_STL_ServerList, (STL_GET_SERVER_HANDLE(hConn) - 1) );
if( pserver )
{
if( pserver->state == STL_SERVER_STATE_NORMAL )
{
/* 获取连接信息 */
pconn = (STL_Connection*)mem_mapaddr( pserver->conn_list, STL_GET_CLIENT_HANDLE(hConn) );
if( pconn )
{
if( pconn->state.flag == STL_CONN_STATE_NORMAL )
{
switch( cmd )
{
case STL_IOCTL_GET_IDLE_INT:
if( arg )
{
(*(UINT32*)arg) = pserver->tIdelMax;
ret = OK;
}
break;
case STL_IOCTL_SET_IDLE_INT:
pconn->tmo.tv_sec = arg / 1000000;
pconn->tmo.tv_usec = arg % 1000000;
ret = OK;
break;
default:
ret = ioctl( pconn->sock, cmd, arg );
}
}
}
}
}
}
else
{
/* Server */
pserver = (STL_Server*)mem_mapaddr( G_STL_ServerList, hConn - 1 );
if( pserver )
{
if( pserver->state == STL_SERVER_STATE_NORMAL )
{
switch( cmd )
{
case STL_IOCTL_GET_IDLE_INT:
(*(UINT32*)arg) = pserver->tIdelMax;
ret = OK;
break;
case STL_IOCTL_SET_IDLE_INT:
pserver->tIdelMax = (*(UINT32*)arg);
pserver->tmo.tv_sec = pserver->tIdelMax / 1000000;
pserver->tmo.tv_usec = pserver->tIdelMax % 1000000;
ret = OK;
break;
default:
ret = ioctl( pserver->sock, cmd, arg );
}
}
}
}
}
return ret;
}
/* 函数功能: 获取连接信息
* 参数说明:
* hConn[IN]: 连接句柄
* *pConn[OUT]: 用来存放连接信息
* 返回值:
* 成功则返回TRUE, 否则返回FALSE
*/
BOOL STL_GetConnection( int hConn,
STL_extConn *pConn
)
{
STL_Server *pserver;
STL_Connection *pcn;
if( G_STL_RUN && STL_GET_SERVER_HANDLE(hConn) > 0 && pConn )
{
/* 获取服务器信息 */
pserver = (STL_Server*)mem_mapaddr( G_STL_ServerList, (STL_GET_SERVER_HANDLE(hConn) - 1) );
if( pserver )
{
if( pserver->state == STL_SERVER_STATE_NORMAL )
{
/* 获取连接信息 */
pcn = (STL_Connection*)mem_mapaddr( pserver->conn_list, STL_GET_CLIENT_HANDLE(hConn) );
if( pcn )
{
if( pcn->state.flag != STL_CONN_STATE_INVALID )
{
pConn->sock = pcn->sock;
memcpy( &pConn->addr, &pcn->addr, sizeof(pcn->addr) );
memcpy( &pConn->state, &pcn->state, sizeof(pcn->state) );
return TRUE;
}
}
}
}
}
return FALSE;
}
/* 获取服务器信息
* 参数说明:
* hServer[IN]: 服务器句柄
* *pServer[OUT]: 用来存放服务器信息
* 返回值:
* 成功则返回TRUE, 否则返回FALSE
*/
BOOL STL_GetServer( int hServer,
STL_Server *pServer
)
{
STL_Server *psv;
if( G_STL_RUN && pServer > 0 )
{
/* 获取服务器信息 */
psv = (STL_Server*)mem_mapaddr( G_STL_ServerList, (hServer - 1) );
if( psv )
{
if( psv->state != STL_SERVER_STATE_INVALID )
{
memcpy( pServer, psv, sizeof(STL_Server) );
return TRUE;
}
}
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -