浏览代码

Socket management : ignore keepalive messages

Fix #40

Signed-off-by: Thomas Guillem <thomas@gllm.fr>
Sylver Bruneau 9 年之前
父节点
当前提交
afd2ac3d9b
共有 1 个文件被更改,包括 16 次插入6 次删除
  1. 16 6
      src/netbios_session.c

+ 16 - 6
src/netbios_session.c

@@ -209,7 +209,7 @@ int               netbios_session_packet_send(netbios_session *s)
     return (sent);
 }
 
-ssize_t           netbios_session_packet_recv(netbios_session *s, void **data)
+ssize_t           netbios_session_get_next_packet(netbios_session *s)
 {
     ssize_t         res;
     size_t          total, sofar;
@@ -228,8 +228,6 @@ ssize_t           netbios_session_packet_recv(netbios_session *s, void **data)
     {
         BDSM_dbg("netbios_session_packet_recv: incorrect size for received packet: %ld bytes",
                  res);
-        if (data != NULL)
-             *data = NULL;
         return (-1);
     }
   
@@ -241,9 +239,6 @@ ssize_t           netbios_session_packet_recv(netbios_session *s, void **data)
         if (!session_buffer_realloc(s, total + sizeof(netbios_session_packet)))
             return (-1);
 
-    if (data != NULL)
-      *data = (void *) s->packet->payload;
-
     //BDSM_dbg("Total = %ld, sofar = %ld\n", total, sofar);
 
     while (sofar < total)
@@ -269,3 +264,18 @@ ssize_t           netbios_session_packet_recv(netbios_session *s, void **data)
     return (sofar);
 }
 
+ssize_t           netbios_session_packet_recv(netbios_session *s, void **data)
+{
+    ssize_t         size;
+
+    // ignore keepalive messages if needed
+    do
+    {
+        size = netbios_session_get_next_packet(s);
+    } while (s->packet->opcode == NETBIOS_OP_SESSION_KEEPALIVE);
+
+    if ((size >= 0) && (data != NULL))
+        *data = (void *) s->packet->payload;
+
+    return (size);
+}