Можно ли передавать поток данных по протоколу HTTP или FTP вместо TCP / IP? - PullRequest
3 голосов
/ 13 июля 2011

Требуется передать поток байтов данных (в байтовом формате) по протоколу HTTP или FTP. Я делаю это с протоколом IP, но так как он не может быть обработан балансировщиками нагрузки. Прямо сейчас я отправляю поток данных путем преобразования в байтовый формат и в конце получателя, декодируя его в виде строки То же самое я хочу сделать с протоколом HTTP.

Socket sock = new Socket(AddressFamily.InterNetwork, 
              SocketType.Stream, ProtocolType.IP);

Здесь, в ProtocolType.IP должен быть HTTP, но опция HTTP отсутствует.

Это приложение WinForms.

Ответы [ 3 ]

8 голосов
/ 13 июля 2011

HTTP не является протоколом на этом уровне - это протокол приложения уровня.

Вы не получаете «сокет HTTP» - вы обычно получаете сокет TCP / IP и записываете данные HTTP поверх этого.

См. модель OSI для получения более подробной информации о задействованных сетевых уровнях.

Я точно не знаю, поддерживают ли встроенные клиентские библиотеки HTTP в .NET потоковые запросы ... возможно, вы захотите отключить буферизацию и записать в поток запросов. Посмотрите, как это выглядит на уровне сокетов, используя что-то вроде WireShark .

4 голосов
/ 13 июля 2011

Перечисление ProtocolType не включает HTTP.HTTP является частью прикладного уровня в модели OSI.Там никогда не было концепции "HTTP Socket".HTTP инкапсулирован в TCP / IP.Перечисление ProtocolType относится к протоколу transport .

С MSDN в перечислении ProtocolType ,

    IP  Internet Protocol.
    IPv6HopByHopOptions     IPv6 Hop by Hop Options header.
    Icmp    Internet Control Message Protocol.
    Igmp    Internet Group Management Protocol.
    Ggp     Gateway To Gateway Protocol.
    IPv4    Internet Protocol version 4.
    Tcp     Transmission Control Protocol.
    Pup     PARC Universal Packet Protocol.
    Udp     User Datagram Protocol.
    Idp     Internet Datagram Protocol.
    IPv6    Internet Protocol version 6 (IPv6).
    IPv6RoutingHeader   IPv6 Routing header.
    IPv6FragmentHeader  IPv6 Fragment header.
    IPSecEncapsulatingSecurityPayload   IPv6 Encapsulating Security Payload header.
    IPSecAuthenticationHeader   IPv6 Authentication header. For details, see RFC 2292 section 2.2.1, available at http://www.ietf.org.
    IcmpV6  Internet Control Message Protocol for IPv6.
    IPv6NoNextHeader    IPv6 No next header.
    IPv6DestinationOptions  IPv6 Destination Options header.
    ND  Net Disk Protocol (unofficial).
    Raw     Raw IP packet protocol.
    Unspecified     Unspecified protocol.
    Ipx     Internet Packet Exchange Protocol.
    Spx     Sequenced Packet Exchange protocol.
    SpxII   Sequenced Packet Exchange version 2 protocol.
    Unknown     Unknown protocol.
2 голосов
/ 13 июля 2011

Смотри http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/7be22396-0f2a-4138-b47a-09d93894185b В первом посте показано, как отправить несколько байтов через HTTP-запрос. Адаптировано для вашего использования:

byte[] data;
// ...
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(server);
request.ContentType = "application/octet-stream";
request.Method = "POST"; // I think, your data is too big for GET
request.ContentLength = data.Length;
try {
    Stream postStream = request.GetRequestStream();
    postStream.Write(data, 0, data.Length);
    postStream.Close();
} catch(Exception ex) {
    throw new Exception(ex.Message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...