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

Я создаю сервер потокового видео в качестве домашнего задания, теперь я хочу отправить данные клиенту с помощью кодирования фрагментированной передачи. Это мой код:

string statusLine = "HTTP/1.1 200 OK\r\n";
string server = "Server: Cougar/12.0.7600.16385\r\n";
string cacheControl = "Cache-Control: no-cache\r\n";
string desRespPragma1 = "Pragma: no-cache\r\n";
string desRespPragma3 = "Pragma: client-id=" + clientId + "\r\n";
string desRespPragma4 = "Pragma: features=" + "\"" + "seekable,stridable" + "\"" + "\r\n";
string transferEncoding = "Transfer-Encoding: chunked\r\n\r\n";
string desResp = statusLine + server + cacheControl + desRespPragma1 + desRespPragma3+ desRespPragma4 + transferEncoding;

byte [] status = Encoding.ASCII.GetBytes(desResp);
SendData(status);//In SendData function, I’m using NetworkStream to send data

//Send chunked size with CRLN
string CRLF = "\r\n";
byte[] crlf = Encoding.ASCII.GetBytes(CRLF);
byte[] chunkedSize = new byte[3];
chunkedSize[0] = 0x4;
Array.Copy(crlf, 0, chunkedSize, 1, 2);
SendData(chunkedSize); 

//Send data
SendData(tHeader);//tHeader’s byte array, length is 4
//Send \r\n to delimeter
SendData(crlf);

//Send chunked size is 0 with \r\n\r\n to end.
byte[] end = new byte[5];
end[0] = 0;
Array.Copy(crlf, 0, end, 1, 2);
Array.Copy(crlf, 0, end, 3, 2);
SendData(end);

Но клиент не получает истинных данных. Я использую Wireshark для захвата пакета и вижу, что клиент получает 2 конца фрагментированного кодирования:

HTTP chunked response

End of chunked encoding
            Chunk size: 0 octets
            Chunk boundary
End of chunked encoding
            Chunk size: 0 octets
            Chunk boundary

Я использую TcpListener для прослушивания соединения от клиента:

TcpListener listener = new TcpListener(ipe);//ipe has my computer ip address and port's 80
Socket socket = listener.AcceptSocket();
NetworkStream ns = new NetworkStream(socket);

Пожалуйста, покажите мне правильный способ отправки данных клиенту с помощью Chunked Transfer Encoding. Я ценю это.


person PenguinSh    schedule 19.08.2011    source источник
comment
вы ничего не пишете о внедрении http... это ваше собственное (на TcpListener)? Это встроенный в HttpListener? Или это через IIS HttpHandler/HttpModule?   -  person Yahia    schedule 19.08.2011
comment
@Yahia: я использую TcpListener для прослушивания соединения от клиента   -  person PenguinSh    schedule 19.08.2011
comment
почему вы используете TcpListener? HttpListener использует аналогичный IIS модуль ядра с именем HTTP.SYS и чрезвычайно эффективен, И у него есть рабочая реализация для HTTP, включая Chunked и многое другое...   -  person Yahia    schedule 19.08.2011
comment
Я знаю. Но в моем упражнении я должен использовать TcpListener. Это просьба моего учителя.   -  person PenguinSh    schedule 19.08.2011
comment
хорошо, но тогда меня нет... надеюсь, что кто-то еще может помочь...   -  person Yahia    schedule 19.08.2011
comment
Какова строка ASCII вашего запроса? В Wireshark щелкните правой кнопкой мыши и выберите «Следовать за потоком TCP» и вставьте его сюда...   -  person DaveRandom    schedule 20.08.2011
comment
@Dave: я разместил свой запрос ниже   -  person PenguinSh    schedule 20.08.2011


Ответы (1)


Я думаю, что ваш способ кодирования длины фрагментированного блока неверен. При кодировании поблочной передачи длина каждого блока также должна быть закодирована в строки ASCII, например:

    byte[] chunkedSize = System.Text.Encoding.ASCII.GetBytes("4\r\n\r\n");
    byte[] end = System.Text.Encoding.ASCII.GetBytes("0\r\n\r\n");
person circleone    schedule 28.04.2016