本文整理汇总了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);
}