There may be more than one message in incoming TCP data

This commit is contained in:
Pierre Pronchery 2014-03-23 12:58:39 +09:00
parent 74216ee392
commit ed27d70cce

View File

@ -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,