socket 에서 data를 read할때요..
글쓴이: sunbee / 작성시간: 목, 2005/03/03 - 1:24오후
예를들어
nonblocking & select 조합으로 서버프로그램이 구성되어 있을때, client에서 1024(혹은 더 많은 byte)를 서버에게 전송한다고 했을때, 네트웍 상황에 따라 1024를 다 받을 수도 있고, 다 못받을 수도 있잖습니까?
한번에 data를 다 받았을 경우에는 select() 에서 readable event가 한번만 감지될 것이고, 그 이상이면 여러번 event가 생기는데요, 완전한 데이타를 이루기 위해서는 앞에서 받았던 packet을 저장하고 있어야 하나요????
그리고
client가 1024 byte를 보낸다고 할때
한번에 server에서 받을 수 있는 최소의 data는 얼만큼입니까?
얼마나 받을지 모르는 상태에서 받아야할 패킷길이만큼의 헤더(5자리)조차도 받지 못하는 상황이 발생할 경우가 있는지 궁금합니다.
@@ 문장력이 짧아서리.. 질문을 이해하실지 몰긋네요..
Forums:
tcp 인가요? udp 인가요?tcp라면 stream 이라 프로그
tcp 인가요? udp 인가요?
tcp라면 stream 이라 프로그래머 입장에서는 덩어리라는 생각으로 접근하면
복잡해 집니다. 일반 파일 다루듯이 생각하세요.
대게 read를 요청할때 기대 바이트를 파라메터로 넘긴후 그 만큼 읽기때까지
blocking을 쓰거나 signal, condition을 사용 합니다.
else에 적당히 예외처리를 넣고요. 무한정 기다릴수 없으니 timeout으로 적당히 기다리면 될거 같습니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
TCP일 경우 data를 하나씩 천천히 보내면 발생할 가능성이 없지만
TCP일 경우 data를 하나씩 천천히 보내면 발생할 가능성이 없지만
무자비(?)하게 보내면 5자리조차 못받을 수 있습니다.
5자리보다 큰지 체크하시고 작으면 받은만큼은 버퍼에
저장 후에 다음 event를 받아서 합쳐야 합니다.
nonblocking의 비애입니다. :)
참고) stream형태이기 때문에 앞의 메시지와 연속될 경우 복잡한
사태(?)가 발생합니다. 5자리도 못받을 수 있는게 이런경우겠죠.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
이런...ㅡㅡ;;
TCP입니다...
그럼.. socket 프로그래밍하시는 분들은 이런경우를 다 생각하셔서 프로그래밍 하시나요~?
nonblocking의 비애가 맞네요~ ㅠㅠ
평상시에는 문제점이 잘 발생하지 않지만스트레스테스트(부하테스트)시
평상시에는 문제점이 잘 발생하지 않지만
스트레스테스트(부하테스트)시 문제가 발생합니다.
반드시 처리하세요 :)
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
원래 제대로 된 TCP애플리케이션을 만드려면 패킷은 별도로 버퍼링해야합니
원래 제대로 된 TCP애플리케이션을 만드려면 패킷은 별도로 버퍼링해야합니다. 특히 사용자정의패킷이라면 더그렇습니다.
homeless
사용자 수준의 버퍼관리가 필요합니다.그리고, 클라이언트가 1024 송
사용자 수준의 버퍼관리가 필요합니다.
그리고, 클라이언트가 1024 송신하면 서버는 1~1024 를 받을 수 있습니다.
read인경우 그 결과를 잘~ 보셔야 합니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
Non-block 소켓이 아니더라도 TCP 에서라면 충분히 가능한 현상입
Non-block 소켓이 아니더라도 TCP 에서라면 충분히 가능한 현상입니다.
앞에 답변하신 분들 말씀처럼, recv() 의 리턴값을 항상 체크해야 합니다.
리턴값 체크 결과 원하는 만큼 받지 못했다면 받은 데이타를 버퍼링하고
나머지 데이타를 계속해서 받아야 겠죠.
char buf[1024];msghd_t* mh;mh = (msg
char buf[1024];
msghd_t* mh;
mh = (msghd_t*) buf;
if(recv(fd, buf, sizeof(msghd_t), MSG_WAITALL) < sizeof(msghd_t) {
close();
} else {
if(recv(fd, buf+sizeof(msghd_t), mh->size, MSG_WAITALL) < mh->size) {
close();
}
}
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
댓글 달기