네트워크 관련 프로젝트 하는 중에 문제가 생겼습니다! 도와주세
글쓴이: kkojiband / 작성시간: 화, 2003/11/18 - 3:46오후
간단한 메신저를 만들고 있는 중인데요...
문제가 생겼습니다...
네트워크 관련 프로젝트는 처음이라 머리가 아픕니다...--;
문제가 되는 부분을 대략 살펴보면...
... write( connectFDes, SEND_INFOR_MESSAGE, HEADER_LENGTH+1 ); for( doing = 0; doing < MEMBER_INFOR_NUMBER; doing++ ) { sprintf( message, "%s:%s", INFOR_MESSAGE, memberInfor->infor[doing] ); write( connectFDes, message, strlen(message)+1 ); } write( connectFDes, DONE_INFOR_MESSAGE, HEADER_LENGTH+1 ); ...
이 부분은 클라이언트가 개인 정보를 작성해서 서버에게 전송하는 부분인데요,(tcp 로 연결했습니다)
클라이언트는 정확히 정보를 다 전송을 하는데 서버가 제대로 받지를 못합니다...( 서버가 받는 부분도 위와 비슷한 모양입니다...)
근데 이상한건 write 할때마다 sleep(1) 이렇게 시간 간격을 주면 제대로 전부다 전송이 됩니다...
전체 프로그램 중에서 유독 클라이언트가 서버에게 정보를 전송하는 부분만 제대로 전송이 안되고 나머지 대화나 서버가 클라이언트에게 정보를 전송해주는 부분은 다 잘됩니다...
대체 왜 이럴까요? 아무리 생각해봐도 이유를 모르겠습니다...
단지 마음에 걸리는거는, 서버와 클라이언트가 한 컴퓨터에서 돌아간다는건데...
이것도 문제될게 없지않습니까? 고수님들 도와주세요~[/code]
Forums:
2번에 걸쳐 write한다고 해도 읽는 쪽에서는 한 번에 읽을 수도, 여
2번에 걸쳐 write한다고 해도 읽는 쪽에서는 한 번에 읽을 수도, 여러번에 나눠 읽을 수도 있습니다.
message의 형식에 길이를 따로 보내나요? 아니면 EOL로 나뉜다거나 하는 format이라도...
저도 고수는 절대 아닙니다만, 아는 한도내에서 답변을^^;;TC
저도 고수는 절대 아닙니다만, 아는 한도내에서 답변을^^;;
TCP는 스트림 프로토콜이라서 메세지 경계 개념이 없이 전달이 됩니다. read 호출을 했을 때, 얼마나 많은 데이터가 읽혀질지는 보장할 수 없습니다.
클라이언트에서 데이터를 다 전달했더라도, 서버에서 read 호출시에는 그 일부만 수신될 수 있다는 얘기입니다. 또는 반대로 클라이언트가 A의 개인정보를 보내고, B의 개인정보를 보냈을때, 의도한대로 서버가 A부터 받고, 다음에 B를 끊어서 받으면 좋겠습니다만, 서버는 A,B를 동시에 받을 수도 있습니다.
그래서 read 함수가 원하는 길이를 받도록 어플리케이션 단에서 처리해줘야 됩니다. Stevens 책 보시면 아마 readn 함수라고 있을겁니다.
write()와 read()의 사용에서 반드시 그 리턴값을 비교하는 습관
write()와 read()의 사용에서 반드시 그 리턴값을 비교하는 습관으로 코딩을
수행하시기 바랍니다.
특히, read()의 경우 현재 커널의 수신버퍼에서 읽을 수 있는 양만큼만을
읽기 때문에 주의가 필요합니다.
100바이트를 읽는다고 가정할때, read()는 이를 100번에 읽을 수도 있습니다.
(물론 가능성이지요) 1번에 읽을 수도 있습니다. 허나, 그것은 장담할 수 없습니다.
따라서, 루프를 사용해서 지속적으로 읽어야 하겠지요. 읽은 바이트수를 누적해서
더해가면서 조건에 만족할 때까지 읽어들이는것이 필요합니다.
바로 readN()등의 이름으로 널리 사용되는 함수들이 있습니다.
이들을 검색해서 사용해보시길 권합니다. 스티븐스책에도 있지요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
방금 혹시나해서 받은 데이타를 분석해보니 쭉 붙어서 오더군요...--;
방금 혹시나해서 받은 데이타를 분석해보니 쭉 붙어서 오더군요...--;
답글 보니 역시나...^^;
답변 감사드립니다~
컴터가 미친지 알고 깜짝 놀랬었습니다...--;
그럼 다들 즐거운 하루~^^
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
댓글 달기