C로 간단한 HTTP 서버 구축 [닫기]


105

C로 간단한 HTTP 서버를 구축해야합니다. 지침이 있습니까? 연결? 샘플?


1
그게 바로 제가 생각한 것입니다
Rik

1
나는 또한 지금 같은 문제가 있었다. 이 링크를 사용 했습니다 . 이것이 당신에게도 도움이되기를 바랍니다.
Udara SS Liyanage

1
질문 하는 방법에 대한 FAQ 는 어떻습니까? 3K 이후에 이것이 실제 질문이 아니라는 것을 알아야합니다. 어떻게 그렇게 많은 찬성표를 얻을 수 있습니까?


1
이것은 분명히 매우 유용한 질문입니다. 폐쇄 된 이유는 무엇입니까?
McBear Holden 2017 년

답변:


85

나는 당신이 작은 httpd를 살펴볼 것을 제안한다 . 처음부터 작성하고 싶다면 RFC 2616철저히 읽고 싶을 입니다. BSD 소켓 을 사용 하여 매우 낮은 수준에서 네트워크에 액세스하십시오.


2
또는 inetd를 사용하고 네트워킹 부분을 건너 뜁니다.
jrockway

22
지금 RFC 2616을 읽지 마십시오. 사용되지 않는 항목 : RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
songhir

2
tiny httpd여기 GitHub의에 있습니다 : github.com/larryhe/tinyhttpd
Purplejacket

119

다음을 살펴 보시기 바랍니다. 클라이언트 및 서버 작성에 대한 실용적인 가이드

증분 단계에서 구현해야하는 것은 다음과 같습니다.

  1. 기본 TCP 소켓 계층을 실행합니다 (포트 / 포트에서 수신, 클라이언트 연결 허용 및 데이터 송수신).
  2. 한 번에 한 줄 (CRLF로 구분)을 읽을 수 있도록 버퍼 된 판독기를 구현합니다.
  3. 첫 번째 줄을 읽으십시오. 메서드, 요청 버전 및 경로를 구문 분석합니다.
  4. "Header : value"구문에 대한 헤더 구문 분석을 구현합니다. 접힌 헤더를 펼치는 것을 잊지 마십시오.
  5. 요청 방법, 콘텐츠 유형 및 콘텐츠 크기를 확인하여 본문을 읽는 방법 / 여부를 결정합니다.
  6. 콘텐츠 유형에 따라 콘텐츠 디코딩을 구현합니다.
  7. HTTP 1.1을 지원하려면 "100 Continue", keep-alive, chunked transfer와 같은 것을 구현하십시오.
  8. 불완전한 요청 감지, 최대 클라이언트 수 제한 등과 같은 견고성 / 보안 조치를 추가합니다.
  9. 코드 축소 및 오픈 소스 :)

포인트 # 9, 특히 여기에 질문을 게시 한 후 +1 :)
Matthieu

26

HTTP 서버는 개념적으로 간단합니다.

  • 청취를 위해 포트 80을 엽니 다.
  • 연락이 이루어지면 약간의 정보를 모으십시오 (주로 얻으십시오-나머지는 무시해도됩니다)
  • 요청을 파일 요청으로 번역
  • 파일을 열고 클라이언트에 다시 뱉어

지원하려는 HTTP의 양에 따라 더 어려워집니다. POST는 조금 더 복잡하고 스크립트, 여러 요청 처리 등입니다.

그러나 기본은 매우 간단합니다.


25

Mongoose (이전의 Simple HTTP Daemon)는 꽤 좋습니다. 특히 Windows, Windows CE 및 UNIX에서 임베드 가능하고 컴파일됩니다.


12

포트 80에서 TCP 소켓을 열고 새 연결 수신을 시작한 다음이를 구현 하십시오 . 목적에 따라 거의 모든 것을 무시할 수 있습니다. 가장 쉬운 방법은 소켓에 텍스트를 쓰는 것과 관련된 모든 요청에 ​​대해 동일한 응답을 보낼 수 있습니다.


11

nweb (Nigel의 웹 서버), "단지 200 줄의 C 소스 코드가있는 작고 안전한 웹 서버 [...]"를보십시오.

https://drive.google.com/file/d/0B3msld7qnNOhN1NXaFIwSFU2Mjg/view?usp=sharing http://www.ibm.com/developerworks/systems/library/es-nweb/

이 기사에는 의사 코드, 설명 및 주석이 포함되어 있습니다.

편집 : IBM의 링크가 죽었습니다. 웹 페이지의 PDF를 Google 드라이브에 저장했습니다. 다음은 코드 다운로드입니다.

https://drive.google.com/file/d/0B3msld7qnNOhSGZGdDJJMmY0VHM/view?usp=sharing

@ ankushagarwal 은 몇 가지 사항을 변경하고 GitHub에 자신의 버전을 업로드했습니다. https://github.com/ankushagarwal/nweb


Eh는 링크를 확인하지 않고 투표했습니다 : / 당신이 언급 한 정확한 것을 찾고 있습니다. 뭔가를 찾으면 저를 핑할 수 있습니까? Txt
samayo

1
@samayo IBM의 링크가 끊어졌습니다. 거울 몇 개를 제공했습니다.
XP1

여기 archive.org에 의해 거울입니다 - 잘하면 앞으로 수년 동안 주위에있을 것입니다 : web.archive.org/web/20140905115151/http://www.ibm.com/...
james246





1

Apache 뒤에있는 사람들처럼 플랫폼 별 소켓 함수를 사용하여 HTTP 프로토콜을 캡슐화하십시오 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.