2013-07-05 4 views
0

Я написал немного SocketWrapper в C только для обучения и он работает. Я отправляю GET-запрос и получаю буфер [1024]. Но контент, который я хотел бы читать, часто длиннее 1024. Как определить длину и получить все данные?C Socket - определение длины данных

#include <stdio.h> 
#include <stdbool.h> 

#include "lib/output.h" 
#include "lib/network.h" 

int main(int argc, char *argv[]) { 
debug_verbose = true; 

struct IPv4_CLIENT client; 
client = socketIPv4("google.com", 80); 

if(socketIPv4_connect(client) < 0) { 
    error("Connect failed!"); 
    return -1; 
} 

char send_buffer[256]; 
bzero(send_buffer, 256); 

printline("Send: "); 
fgets(send_buffer, 255, stdin); 

socketIPv4_write(client, send_buffer); 

char receive_buffer[1024]; 
socketIPv4_read(client, receive_buffer, 1024); 
hexdump(receive_buffer, 1024); 

socketIPv4_close(client); 

return 0; 
} 
+1

Вот почему есть HTTP [спецификация протокола] к (http://www.w3.org/Protocols/rfc2616/rfc2616.html) - это рассказывает вам, как делать подобные вещи. (Какую версию HTTP вы пытаетесь реализовать? Правила для 1.1 намного сложнее - вы * должны * поддерживать закодированную кодировку.) –

ответ

2

Вы не можете определить общую длину данных для приема при использовании TCP/UDP. Таким образом, вы должны реализовать протокол по этому базовому протоколу, чтобы определить общую длину для получения. Поэтому, когда вы узнаете размер, вы ожидаете и читаете эти данные.

Здесь, в вашем случае HTTP, стандарт определяет отдельный заголовок под названием Content-Length с целью придания общей длины тела . Но, чтобы читать заголовки, вы можете получать произвольное количество данных, пока не получите все заголовки, а затем заданный объем содержимого тела.

spec Прочитайте понять заголовки, тело, разделители ..

+0

Hello VoidPointer! Я собираюсь сделать это так! Спасибо за вашу быструю помощь. Raptor – raptor

2

Рассмотрим один из двух следующих подходов:

  • Отправить размер данных, которые вы хотите передать до фактических данных. Используйте формат фиксированной длины для передачи размера.

  • Определите любой разделитель, обозначающий конец данных, и продолжите перераспределение буфера приема до тех пор, пока не будет получен разделитель.

+0

Привет, спасибо за ваш быстрый ответ. Это именно то, чего я хотел. Теперь я перейду в поле Http-Header «Content-Length» для перераспределения моего буфера. Raptor – raptor

+0

Nitpick: размер данных необязательно должен быть фиксированным, он сам может быть ограничен. Этот третий вариант заключается в том, как работает «закодированная» кодировка. Кроме того, некоторые форматы (например, хорошо сформированный XML) являются саморазграничивающими и не требуют внешнего разделителя. – user4815162342