C를 이용한 http 서버에 대해서 질문드립니다.
글쓴이: tokyo9pm / 작성시간: 목, 2014/12/04 - 1:54오전
안녕하세요, http 서버를 올리는데 잘 안되는 부분.. 잘 모르겠어서 여쭈어봅니다.
웹서버 자체는 책에서 간단하게 소개한 구조대로 짰습니다.
소켓
바인드
리슨
루프(
클라이언트소켓 = 어셉트
pthread_create( http service )
pthread_detach
)
의 순서로 짰고, http service 부분에서는
소켓으로 넘어오는 http request를 받아서 파싱해서 정보를 얻고,
정보대로 요청을 수행해줍니다. (파일명따라 컨텐츠타입 설정후 파일 보냄,cgi일때는 C 프로그램 실행)
클라이언트 소켓은 각각 read, write로 파일 포인터로 열어서 사용하고 있습니다.
지금 궁금한 것이, 브라우저에서 요청을 보낸 것이 서버에는 잘 들어가는데
서버에서 클라이언트로 응답값을 안보냅니다..
텔넷으로 찍어봐도 값이 안들어오네요.
코드상으로는 리퀘스트 읽고 - fclose(read) - 리스폰스 보내고 - fclose(write) 순인데
왜 안보내는지 잘 모르겠네요.. 응답헤더 나머지 필드는 fputs로 보내고, 바디는 fwrite로 보냈습니다.
마지막으로 분명 클라이언트가 붙을 때마다 스레드를 새로 생성시켜줬는데,
한 클라이언트가 붙으면, 그 다음 클라이언트는 대기를 합니다. 무한로딩......
간단하게 꼭 필요한 기능만 구현하면 얼마 안 걸릴것 같았는데 의외로 어렵네요..
조언 부탁드립니다.
Forums:
자문자답
바보같았네요. 리퀘스트 파싱하는 과정에서 파싱 편하게 하려고 fgets로 받아왔는데
메시지 전부 받아오고도 루프를 돌아서 blocking되고 있던 거였네요.
리퀘스트 받을때만 non block설정 해줘서 해결했습니다.
그런데 무한로딩 문제는 아직 뭐가 문제인지 모르겠네요.
댓글 달기