[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Lost] [Patch] tcpip: TCP-Sendepuffer und Binärdaten



Bisher hat tcpip den Payload ausgehender TCP-Pakete als nullterminierten String behandelt, was selbstverständlich völliger Unsinn ist. Mit diesem Patch wird die von LostIO kommende richtige Größe benutzt, was das Versenden von Binärdaten erleichtern sollte.
Index: include/tcp.h
===================================================================
--- include/tcp.h	(Revision 629)
+++ include/tcp.h	(Arbeitskopie)
@@ -102,7 +102,12 @@
     void*   data;
 };
 
+struct tcp_out_buffer {
+    size_t  size;
+    void*   data;
+};
 
+
 void init_tcp();
 struct tcp_connection* tcp_open_connection(dword ip, word port);
 
Index: tcp.c
===================================================================
--- tcp.c	(Revision 629)
+++ tcp.c	(Arbeitskopie)
@@ -136,10 +136,9 @@
     if (list_is_empty(conn->out_buffer)) {
         tcp_send_packet(conn, NULL, 0, TCPF_ACK);
     } else {
-        void* data = list_pop(conn->out_buffer);
-        DEBUG_MSG1("Sende %d Bytes", strlen(data));
-        tcp_send_packet(conn, data, strlen(data), TCPF_ACK | TCPF_PSH);
-        DEBUG_MSG("Gesendet");
+        struct tcp_out_buffer* data = list_pop(conn->out_buffer);
+        DEBUG_MSG1("Sende %d Bytes", data->size);
+        tcp_send_packet(conn, data->data, data->size, TCPF_ACK | TCPF_PSH);
         // TODO free
     }
 }
@@ -286,6 +285,7 @@
         big_endian_word(header->source_port), 
         big_endian_word(header->dest_port));
 
+    DEBUG_MSG("--");
     if (conn == NULL) {
         DEBUG_MSG1("Verbindung nicht gefunden. IP = %08x", source_ip);
         return;
@@ -354,9 +354,10 @@
     payload = data + (4 * header->data_offset);
     payload_size = data_size - (4 * header->data_offset);
 
-    DEBUG_MSG1("Ack: %08x", header->ack);
-    DEBUG_MSG1("Seq: %08x", header->seq);
+    DEBUG_MSG1("Ack:   %08x", header->ack);
+    DEBUG_MSG1("Seq:   %08x", header->seq);
     DEBUG_MSG1("Flags: %02x", header->flags);
+    DEBUG_MSG1("Size:  %02x", payload_size);
 
     // FIXME Eigentlich müssen nicht nur die Daten in die richtige Reihenfolge
     // gebracht werden, sondern alle Pakete. Ansonsten könnte z.B. ein FIN vor
Index: lostio_if.c
===================================================================
--- lostio_if.c	(Revision 629)
+++ lostio_if.c	(Arbeitskopie)
@@ -223,12 +223,12 @@
         v();
         return 0;
     }
-    
-    char xdata[blocksize * count + 1];
-    memcpy(xdata, data, blocksize * count + 1);
-    xdata[blocksize * count] = '\0';
 
-    list_insert(conn->out_buffer, list_size(conn->out_buffer), xdata);
+    struct tcp_out_buffer* out_buffer = malloc(sizeof(*out_buffer));
+    out_buffer->data = data;
+    out_buffer->size = blocksize * count;
+
+    list_insert(conn->out_buffer, list_size(conn->out_buffer), out_buffer);
     //list_push(conn->out_buffer, "GET / HTTP/1.0\r\n\r\n");
     
     while (!list_is_empty(conn->out_buffer)) {