tcp통신에서 send,recv에관한 질문입니다.
글쓴이: itexpert / 작성시간: 수, 2004/05/12 - 5:24오후
안녕하세요
tcp서버와 다중클라이언트간의 통신을 할려고하는데요.
보통 tcp서버측에서는 client가 접속시 accept하고,
recv()를 실행할수있고,
또는 소켓기술자(select를 사용해서 구현했을경우 입니다)
각 client의 기술자를 통해 recv할수가 있는데.
그럼 클라이언트에서 send할수있는 기회는 두번.
서버측에서도 2번.
그런데 제가 하려는 작업의 특성상.
최소 5쌍의 send,recv 가 서버와 클라이언트사이에 일어나야하는데요
각쌍마다 다른정보를 전송해주도록 할거거든요.
예를 들어. client에서 A라는 정보를 send 하고, B라는 정보를 send,,,하면
서버에서는 각 recv문이 구별을 해서 받을수있도록 구현하고 싶거든요.
각 정보를 저장하는 변수또한 틀리니까.
A라는 정보를 send했는데 서버에서 B라는정보를 받는recv에서 A정보를
recv하면 안되니까요..
이러한 작업을 하고 싶은데..감이안오네요..어떤식으로 해야할지.
답변주시면 정말 감사하겠습니다.
수고하세요
Forums:
[quote]client에서 A라는 정보를 send 하고, B라는 정보를
소켓을 2개 만들고 A정보는 1번소켓으로 B는 2번소켓으로 받으세요.
recv함수가 호출될시에 fd를 체크해서 정보를 구별하면 됩니다.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
그럼여..
일단.접속되는 클라이언트마다
fd가 유일하게 생성되는데요.
그유일한 fd를 통해서 클라이언트와 통신이 가능하며,
거기에 성격이 다른 정보A,정보B를 보내야하는데.
그안에 소켓을 더 만든다는 의미인가요?
잘 이해가 안되서요.^^;;
답변주시면 감사하겠습니다.
tcp통신은 신뢰성을 바탕으로하기 때문에 사용자헤더를 만들잖아요.그사
tcp통신은 신뢰성을 바탕으로하기 때문에 사용자헤더를 만들잖아요.
그사용자헤더 구조체안에 서비스코드등을 두어서 A정보인지 B정보인지 가려내서 처리하면 되지 않을까요?
질문의 의도가 이게 아니라면 다시 설명좀...^^
넵.
의도가 맞거든요. ^^ 연결된 소켓을 바탕으로 그 클라이언트의
아이디,암호 체크나 서버에서 접속되어잇는 클라이언트들의 정보들이나.등등
또한 여러정보를 주고 받아야하는데.
제가 아는 send/recv의 상황은 두번밖이라. 두번을 이용하여 처리하기엔
한계가 있어서요.
A정보도 구조체이고, B정보도 다른구조의 구조체이고. 성격자체가 틀리기
때문에요. 이럴때 어떻게들 처리해주는지 궁금해서요.
같은성격의 정보라면 그렇게 해도 될듯 싶은데요.전혀틀려서요
쉽게말해.
서버 ---클라이언트1
<--아이디,암호전송
-->접속자들의 정보전송
<-- 정보3..
<-- 등등.
클라이언트는 다수입니다.
이런경우 입니다. 이럴때 서버나 클라이언트에서 적절히 recv나 send해야
하거든요.
TCP socket은 application에 byte stream을 제공
TCP socket은 application에 byte stream을 제공합니다.
send 를 두번 했다고 해서, 받는 쪽에서 recv를 두번 해서 읽을 것이라는 보장은 없습니다.
MESG_TYPE field를 따로 두시는 방법이 좋을 것 같습니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
네..
MESG_TYPE field를 따로 두어 구현하는 방법이 어떻게될까요?
지금 보고있는 책에서는 못본것같아서요.
[quote]tcp통신은 신뢰성을 바탕으로하기 때문에 사용자헤더를 만들잖
단일 소켓이면 이 방법밖에 없습니다.
헤더 중에 일치된 헤더 하나를 만들어서 일치시켜야 됩니다. 부가적인 정보를 붙여서 처리하세요.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
위에 답이 있는 것 같은데 부연비스꾸리하게 하자면인터넷 익스플로러
위에 답이 있는 것 같은데 부연비스꾸리하게 하자면
인터넷 익스플로러를 예로 한번 들어보져
인터넷 익스플로러에 gif 던 jpeg 던 해당 파일이있는 곳의 위치를
입력하면 해당 이미지가 표시가 되자나요?
인터넷 익스플로러가 해당 파일을 내부 포맷을 파일확장자 명으로
구별하는 방식을 사용했다고 가정하면(실제 그렇지 않지만)
소켓통신을 위의 답글중 하나인 "복수개의 fd 값을 이용해서 구별한다"에
비유한다면
실제 IE는 gif 나 jpeg 를 확장자를 보는게 아니고 해당 파일의 헤더를 읽고
헤더에 있는 정보를 분석해서 구별합니다.
이걸 소켓 통신으로 보면 요청용 헤더패킷을 하나 만들고 그 패킷안에 요청별
구분 코드를 셋팅해서 요청하고 받는 측에서는 헤더패킷의 요청구별코드에
따라 분기해서 용청코드에 부합하는 응답을 해주는 방식이라고 할 수 있지
않을까 하네요.
네
답변감사드립니다.죄송한데..예좀 들어 설명좀 해주실수 있으세요?
간단한 구문이라두요. .. 헤더에대한 지식은 책에서 못봐서.
생소하네요.
어짜피 앞에 헤더는 공통이니 긴 스트림중에서 헤더사이즈만큼만 헤더구조체로
어짜피 앞에 헤더는 공통이니 긴 스트림중에서 헤더사이즈만큼만 헤더구조체로 케스팅한후에
헤더의 서비스코드를보고 A타입이면 A타입구조체로 캐스팅
B타입이면 B타입구조체로 캐스팅...
하면 됩니다.
그리고 헤더안에는 메시지사이즈를 넣으셔야죠...
그래서 recv할때 우선 헤더사이즈만큼 받았는지 확인후
헤더로 캐스팅한다음 메시지사이즈만큼 받았는지 꼭 확인하세요...
TCP에서 send와 recv의 어떠한 일치도 장담할수 없습니다.
그리고 구조체 변수중 숫자형은 htonl,ntohl 빼먹지 마시구요.. ^^
네트워크 소켓에 대해서 개념부터 잡는게 좋을듯 싶네요.
님은 send/recv를 하나의 소켓에서 하면 서로 섞일수가 있다고 생각하시는것 같습니다. I/O multiplexing이나 소켓, 파일디스크립터를 다루는 부분을 좀더 공부하지 않으시고 더 접근하신다면 매번 문제가 생깁니다.
좀더 운영체제나 파일관련된 부분을 공부하신다면 위의 질문에 대한 답은 자연스레 해결됩니다. 이것들은 솔직히 책을 제대로 공부하시면 답이 다 나옵니다. ^^
========================================
* The truth will set you free.
댓글 달기