当前位置: 首页>>代码示例>>C++>>正文


C++ TcpClient::data_in_cb方法代码示例

本文整理汇总了C++中TcpClient::data_in_cb方法的典型用法代码示例。如果您正苦于以下问题:C++ TcpClient::data_in_cb方法的具体用法?C++ TcpClient::data_in_cb怎么用?C++ TcpClient::data_in_cb使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在TcpClient的用法示例。


在下文中一共展示了TcpClient::data_in_cb方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: read_loop_proc

/* Calls receive on the client's socket until either an error happens
 * or the socket is closed. */
static void* read_loop_proc(void* void_client)
{
	TcpClient* client = (TcpClient*)void_client;
	char in_buff[64 * 1024];
	int in_count;
	int rval;
	struct timeval tv;
	socklen_t tv_len = sizeof(tv);

	flag_raise(&client->flag_pole, THREAD_IS_RUNNING);
	pthread_cond_broadcast(&client->read_cond);

	/* Ensure there is a timeout set for the socket.  If one does not
	 * exist, then set the timeout to 1 second. */
	if(getsockopt(client->sock, SOL_SOCKET, SO_RCVTIMEO, &tv, &tv_len))
		goto f_return;
	if(!tv.tv_sec && !tv.tv_usec)
	{
		tv.tv_sec = 1;
		if(setsockopt(client->sock, SOL_SOCKET, SO_RCVTIMEO, &tv, tv_len))
				goto f_return;
	}

	while(!(client->flag_pole & THREAD_STOP) && client->sock > -1 &&
			client->data_in_cb)
	{
		/* Wait for data. */
		in_count = recv(client->sock, in_buff, sizeof(in_buff), 0);

		/* Disconnected/error occurred. */
		if(in_count <= 0)
		{
			if(errno == EWOULDBLOCK)
			{
				errno = 0;
				continue;
			}
			else
			{
				/* We can't call 'TcpClient_disconnect()' if the object is in a delete
				 * state because it has already been called. */
				if(!(client->flag_pole & OBJECT_DELETE_STATE))
					TcpClient_disconnect(client);
				break;
			}
		}
		/* Data received. */
		else
		{
			rval = client->data_in_cb(client, in_buff, in_count);
			if(rval & (SCB_RVAL_CLOSE_CLIENT | SCB_RVAL_STOP_SERVER))
				TcpClient_disconnect(client);
			if(rval & (SCB_RVAL_DELETE))
			{
				pthread_detach(client->read_thread);
				flag_lower(&client->flag_pole, THREAD_CREATED);
				delTcpClient(&client);
			}
		}
	}

f_return:
	flag_lower(&client->flag_pole, THREAD_IS_RUNNING);
	pthread_cond_broadcast(&client->read_cond);

	if(client->thread_returning_cb)
		client->thread_returning_cb(client);

	return(NULL);
}
开发者ID:acs9307,项目名称:alib-c,代码行数:72,代码来源:TcpClient.c


注:本文中的TcpClient::data_in_cb方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。