⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usrsocklib.c

📁 基于Vxworks平台的几个代码(C)
💻 C
📖 第 1 页 / 共 2 页
字号:
							
							/* 关闭套接字 */
							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 + -