2012-01-14 3 views
1

HTTP 프로토콜을 사용하여 파일을 보내야하지만 큰 파일이있어서 소켓을 사용해야합니까? 아니면 같은 WinHttpApi를 사용할 수 있습니다winHttpApi 또는 소켓을 사용하여 큰 파일을 보내는 것이 현명한 방법입니까?

BOOL HttpSendRequest(
    __in HINTERNET hRequest, 
    __in LPCTSTR lpszHeaders, 
    __in DWORD dwHeadersLength, 
    __in LPVOID lpOptional, 
    __in DWORD dwOptionalLength 
); 

내가 원하는 파일의 lpOptional를 사용할 수 있습니까? 파일을 분리하거나이 API가 큰 파일을 처리해야합니까?

HTTP API를 사용하고 데이터를 분리해야한다면 파일 크기에 제한이 있습니까?

+1

HTTP가 파일을 보내기 위해 사용한다고 생각하는 것은 무엇입니까? :-) – ziesemer

+0

@ziesemer 소켓을 사용하고 있다는 것을 알고 있습니다.하지만 소켓에서 MTU로 패킷을 보내지 않아야합니다. 제 질문은 HTTP apis를 처리 할 때 필요하거나 이미이 오버 헤드를 구현에 넣었습니다. – CnativeFreak

답변

2

HTTP uses TCP sockets :

HTTP 통신은 대개 TCP/IP 연결을 통해 이루어집니다. 기본 포트는 TCP 80 [19]이지만 다른 포트도 사용할 수 있습니다. 이 경우 은 인터넷이나 다른 네트워크의 다른 프로토콜 인 위에 HTTP가 구현되지 못하도록하지 않습니다. [...]

(그것은 다른 원리를 사용하여 뭔가를 할 수 있지만, 매우 특이한 것이다.)

소켓을 통해 자신의 프로토콜을 설계 통해 HTTP를 사용하는 이점이 있다는 것입니다 기존 HTTP 라이브러리를 많이 (다른 인수 사이). 어쨌든 파일을 시작하고 중지 할 때 원격 상대방에게만 알리려면 자신 만의 작은 프로토콜을 정의해야합니다.

HTTP와 함께하는 데 도움이되는 몇 가지 포인트 : 당신이 Content-Length header 또는 chunked transfer encoding을 사용하여 파일을 읽는 마친 그것은 당신을 말할 수

HTTP를 사용하도록 선택한 경우, 그것에 대해 조금 더 읽어보십시오. 실제로 웹 서버와 웹 클라이언트가 필요한 것을 구현하고 있음을 알 수 있습니다. lpOptional에 대해 모르겠지만 구성하는 URL에 가져올 파일을 지정해야합니다. (서버에 자신의 URL 공간을 구축하십시오.)

+0

문제는 내가 클라이언트에서 서버로 업로드하는 HTTP를 사용하는 것입니다 ... 내 질문에 그냥 MTU 또는 HTTP API를 평등하게 패킷을 만드는 방법에 대해 신경을 해야하는지 알고 Microsoft가 대신 않습니다 ... 이론적으로 그들은 그것을 구현해야합니다 .. – CnativeFreak

+0

HTTP가 처리 할 것입니다. 실제로, 일반 TCP 소켓의 경우에도 OS는 MTU 분할을 처리해야합니다 (이는 알고있는 한 UDP 소켓의 경우 주로 문제입니다). – Bruno

+0

리눅스에서 TCP 소켓은 그 일을 처리하지 않습니다 ... 저는 윈도우즈가 수행하기를 희망합니다 ... – CnativeFreak

1

HTTP는 소켓 상단의 상위 계층 프로토콜입니다. 따라서 소켓을 가지고 어떤 문제라도 HTTP에 직면하게 될 것입니다.

생각한 파일의 크기는 어느 정도입니까? 거의 모든 제약은 API의 선택으로 인한 것이 아니라 대역폭과 같은 제한 사항 때문일 것입니다. 의 연결을위한

+0

소켓에서는 데이터를 최대 전송 단위보다 작은 조각으로 분할해야한다는 것을 기억하지만, Microsoft가 HTTP 프로토콜을 구현하고 API를 제공 한 이래로 ... 나는 이것을 구현했는지 궁금합니다 (소켓을 사용하는 ofcaurse 이후로 궁금합니다). API) – CnativeFreak

+0

@CnativeFreak - 가장 낮은 수준의 API를 소켓에 사용하는 경우에만 - 다시 HTTP API가 배후에서 수행되어야합니다. – ziesemer

관련 문제