[질문] 소켓 프로그래밍에서요... 중간에 무한루프도 아니고 그?
글쓴이: lee3390 / 작성시간: 목, 2004/09/09 - 5:42오전
서버는 mysql과 연동하여 클라이언트에서 받은 쿼리문을 mysql에 보내고
그결과를 파일로 만든 후 그 파일을 다시 읽어서 클라이언트에 보내주는
역할을 하고, 클라이언트는 mysql 쿼리문을 서버에 보낸 후 서버에서 보내
주는 쿼리문에 대한 결과를 파일로 저장하는 역할을 합니다.
여기서 문제는 클라이언트가 서버에서 보내주는 쿼리에 대한 결과를 읽어
파일에 저장을 하는데
while((n=read(fd,buff,sizeof(buff))) > 0 ) { write(clientfd,buff,n); bzero(buff,sizeof(buff)); }
처음 한번 read는 잘되고 2번째에 read에서 멈춰버리네요 무한루프 도는
것도 아니고 아무일 없이 멈춤상태가... 그래서 프로그램을 제대로 빠져나
오질 못합니다. 무엇이 잘못된 걸까요..?
몇시간째 이것만 쳐다보다 안되서 올려봅니다... ㅠ.ㅠ
원본 소스 첨부합니다.
Forums:
흐름제어(tcp flow control) + 버퍼(tcp internal
흐름제어(tcp flow control) + 버퍼(tcp internal buffer) 문제로 보입니다.
일단 다음 코드를 (server.c 95 line)
다음 처럼 수정한 후 증세를 얘기해 주세요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
아무 변화가 없습니다.client에서 n값인 128과 그아래 프린
아무 변화가 없습니다.
client에서 n값인 128과 그아래 프린트해준 0을 찍어주고는 멈추네요 다운된것
처럼요. 서버를 종료하면 그때서야 1과 2가 찍히며 client가 종료됩니다.
왜 멈추는지 이유를 알수가 없네요..
fd를 non-blocking으로 만들고 select를 사용해서 버퍼가
fd를 non-blocking으로 만들고 select를 사용해서 버퍼가 준비되면 read를
호출하는 걸로 하세요.
서버에서 write를 할때도 성공했는지의 유무도 확인하세요.
서버에서 모두 write한후 client가 다 받았음을 확인하고 close 하는것도 잊지 마시기 바랍니다. 이렇게 할려면 서버가 보낼 양을 먼저 client가 수신을 하고 client는 그 기대만큼 read를 시도 하게 해야 합니다. 서버의 write가 성공적이였다고 해서 서버 tcp 스택에서 client의 tcp 스택으로 옮겨 졌다고는 볼 수 없습니다.
무조건 보내고 무조건 받는 식의 구현은 신뢰할수 있는 방법이 아닙니다.
얼마만큼 보낼 예정이고 얼마를 보냈는데 그만큼 받았는지 확인하는 형태로 작성해야 합니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
음 다음 글을 한번 읽어보시지요.비슷한 문제로 보입니다.[url]
음 다음 글을 한번 읽어보시지요.
비슷한 문제로 보입니다.
http://bbs.kldp.org/viewtopic.php?t=36468
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기