There may be more than one message in incoming TCP data
This commit is contained in:
parent
74216ee392
commit
ed27d70cce
|
@ -688,6 +688,7 @@ static int _tcp_callback_connect(int fd, TCP * tcp)
|
||||||
|
|
||||||
|
|
||||||
/* tcp_socket_callback_read */
|
/* tcp_socket_callback_read */
|
||||||
|
static AppMessage * _socket_callback_message(TCPSocket * tcpsocket);
|
||||||
static void _socket_callback_read_client(TCPSocket * tcpsocket,
|
static void _socket_callback_read_client(TCPSocket * tcpsocket,
|
||||||
AppMessage * message);
|
AppMessage * message);
|
||||||
static void _socket_callback_read_server(TCPSocket * tcpsocket,
|
static void _socket_callback_read_server(TCPSocket * tcpsocket,
|
||||||
|
@ -696,10 +697,7 @@ static int _socket_callback_recv(TCPSocket * tcpsocket);
|
||||||
|
|
||||||
static int _tcp_socket_callback_read(int fd, TCPSocket * tcpsocket)
|
static int _tcp_socket_callback_read(int fd, TCPSocket * tcpsocket)
|
||||||
{
|
{
|
||||||
size_t size;
|
AppMessage * message;
|
||||||
Variable * variable;
|
|
||||||
Buffer * buffer;
|
|
||||||
AppMessage * message = NULL;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s(%d)\n", __func__, fd);
|
fprintf(stderr, "DEBUG: %s(%d)\n", __func__, fd);
|
||||||
|
@ -712,22 +710,7 @@ static int _tcp_socket_callback_read(int fd, TCPSocket * tcpsocket)
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s() read() => %ld\n", __func__, ssize);
|
fprintf(stderr, "DEBUG: %s() read() => %ld\n", __func__, ssize);
|
||||||
#endif
|
#endif
|
||||||
/* FIXME run this code in a loop? */
|
while((message = _socket_callback_message(tcpsocket)) != NULL)
|
||||||
size = tcpsocket->bufin_cnt;
|
|
||||||
/* deserialize the data as a buffer (containing a message) */
|
|
||||||
if((variable = variable_new_deserialize_type(VT_BUFFER, &size,
|
|
||||||
tcpsocket->bufin)) == NULL)
|
|
||||||
/* XXX assumes not enough data was available */
|
|
||||||
return 0;
|
|
||||||
tcpsocket->bufin_cnt -= size;
|
|
||||||
memmove(tcpsocket->bufin, &tcpsocket->bufin[size],
|
|
||||||
tcpsocket->bufin_cnt);
|
|
||||||
if((variable_get_as(variable, VT_BUFFER, &buffer)) == 0)
|
|
||||||
{
|
|
||||||
message = appmessage_new_deserialize(buffer);
|
|
||||||
buffer_delete(buffer);
|
|
||||||
}
|
|
||||||
if(message != NULL)
|
|
||||||
{
|
{
|
||||||
switch(tcpsocket->tcp->mode)
|
switch(tcpsocket->tcp->mode)
|
||||||
{
|
{
|
||||||
|
@ -742,12 +725,32 @@ static int _tcp_socket_callback_read(int fd, TCPSocket * tcpsocket)
|
||||||
}
|
}
|
||||||
appmessage_delete(message);
|
appmessage_delete(message);
|
||||||
}
|
}
|
||||||
else
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static AppMessage * _socket_callback_message(TCPSocket * tcpsocket)
|
||||||
|
{
|
||||||
|
AppMessage * message = NULL;
|
||||||
|
size_t size;
|
||||||
|
Variable * variable;
|
||||||
|
Buffer * buffer;
|
||||||
|
|
||||||
|
size = tcpsocket->bufin_cnt;
|
||||||
|
/* deserialize the data as a buffer (containing a message) */
|
||||||
|
if((variable = variable_new_deserialize_type(VT_BUFFER, &size,
|
||||||
|
tcpsocket->bufin)) == NULL)
|
||||||
|
/* XXX assumes not enough data was available */
|
||||||
|
return NULL;
|
||||||
|
tcpsocket->bufin_cnt -= size;
|
||||||
|
memmove(tcpsocket->bufin, &tcpsocket->bufin[size],
|
||||||
|
tcpsocket->bufin_cnt);
|
||||||
|
if((variable_get_as(variable, VT_BUFFER, &buffer)) == 0)
|
||||||
{
|
{
|
||||||
/* FIXME report the error */
|
message = appmessage_new_deserialize(buffer);
|
||||||
|
buffer_delete(buffer);
|
||||||
}
|
}
|
||||||
variable_delete(variable);
|
variable_delete(variable);
|
||||||
return 0;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _socket_callback_read_client(TCPSocket * tcpsocket,
|
static void _socket_callback_read_client(TCPSocket * tcpsocket,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user