소켓통신...질문이요
글쓴이: 익명 사용자 / 작성시간: 토, 2002/11/16 - 10:54오후
안녕하세요
지금 아주간단한 소켓통신 프로그램짜는데
전...client쪽만 짜거든요
접속해서 접속을 계속 유지하고 데이터 있을때만 날리고
ack nak냐 체크해서 또날리고 안날리고 이렇게 짜는데요
처음접속 해서 데이터를 한번보내고 ack nak체크하고
프로그램이끝나는데......계속 커넥트하게 할려면 어떻게야하는지
이해가 안가네요!
프로 그램 첨짜는 초짜라서......잘모르겠네요
만은걸 바라는건 아니지만.....방향이라도...
인터넷에서 자료 찾은건 이해가 안가서요~~
부탁드려요
Forums:
Re: 소켓통신...질문이요
안녕하세요
클라이언트나 서버나 그 원리는 거의 대동소이합니다. 아주 조금만 다르거
든요. 클라이언트쪽 역시 서버와 통신 할려면 무엇인가 받을려고 대기하
고 있어야 하는 녀석이 있는가 하면 서버도 마찬가지겠지요.? 그래서 서버
나 클라이언트나 모두 무한대기(거의 대부분)하고 있어야 할겁니다. 이때
대기하고 있는 쪽에 무엇인가 들어 오면 처리하면 되겠지요.
먼저 클라이언트쪽만 말씀 드릴께요.
1. 소켓 초기화
2. 통신 초기화(주소나 통신 포트등등)
3. 서버에 접속하기
4. 분기하기
5. 무한 루프
5-1. 보내기
5-2. 받기
대충만 생각해 보았는데 아마 이러한 그림이 될겁니다. 이렇게 통신 프로
그램을 처리 하는 방법은 거의다 똑같습니다. 몇가지 알아야 하거나 주의
할 점이 있긴 한데 그것은
1. "TCP/IP 통신에서는 데이터가 가는것은 확실하지만 언제 얼마큼씩 갈지
는 모른다."는 가정을 해야만 합니다. 보내거나 받고자 하는 데이터가 아
주 작은 사이즈일 때는 문제가 되지 않지만 많거나 빈번하거나 할때는 통
신에서 한꺼번에 다 받지 않고 나누어서 받을때가 있습니다. 이때 이것을
처리 해주기 위해서는 데이터 공간을 잡아 놓고 그 공간만큼 받게 하는것
이 아니라 받아야할 사이즈나 보내야할 사이즈를 직접(정수형으로)넣어 주
는것이 최선의 방법이 아닌가 생각됩니다. 이점만 유의 하시면 별다른 문
제는 없을겁니다. 예를 들면 send나 recv시에 sizeof(BUFF) 가 아니라
BUFF의 길이를 직접 넣어 주는 방법을 생각하셔야만 할겁니다. 여기서 한
가지 아이디어를 얻을수 있는것은
내가 10바이트를 보낸다고 해도 전송시 5바이트만 갈수가 있습니다. 하지
만 이때 실제 전송된 바이트를 함수가 리턴하므로 나머지 바이트를 마저
전송하게 하는 루틴을 만들면 될겁니다. 받을때도 마찬가지 입니다.
하지만 다행스러운것은 만들고자 하시는 프로그램이 단순이 ACK/NAK와 같
은 CHEAT-CHAT(혹은 HEARTBEAT) 관련된 데이터 이므로 이부분은 크게 신경
쓰지 않으셔도 될겁니다.
2. 질문하신 내용중 주요한 부분인데 어떻게 무한 루프를 돌게 하느냐는
것인데 이때 방법은 크게 3가지가 있습니다. 먼저 FORK(), SELECT, POLL()
등이 그것입니다. 아주 간단한것이라면 FORK를 사용하시고 이 통신 프로그
램이 주요한것이라면 나머지 두가지 방법을 사용하시는것이 좋을듯 싶습니
다. 물론 THREAD를 생성해서 하시는 방법도 있습니다. 만약 win32 프로그
램이시라면 당연 thread 방식을 선택하셔야만 할겁니다.
인터넷을 보시면 저기 각각의 방법에 대해 아주 자세한 도움들을 찾으실
수 있을겁니다. 이곳 게시판에서도 select나 poll에 대해 검색을 해보시
면 다른분들의 대답을 주루룩 찾아 보실수 있고 kldp 번역판도 이와 관련
된것이 있습니다.
즐거운 하루 되세요.
Re^2: 소켓통신...질문이요
캄사 합니다 많은 도움이 되었습니다.
프로그램은 아직도 모짜고 생각만 하고 있지만..
씨 프로 그램 첨짜는거라서...카피도 힘들군요.
알아야 카피를 하지....^^;
근데 poll이나 select보니까 리드 라이트로 쓰던데....
전 recv 하고 send 하고 명령어 쎃는뎅..
아직도 이해가 안가네여..
아무튼 갈방향도움되어서 감사합니다.
Re^3: 소켓통신...질문이요
ssize_t read(int fd , void * buf , size_t count);
int recv(int s , void * buf , size_t len , int flags);
read와 recv의 프로토 타입입니다. 보시면 아시겠지만 그 원형이 똑같습니
다. 모두다 파일 디스크립터를 기준으로 원하는 길이만큼 읽어 들이게 하
는것입니다. 두개다 신경쓰지 마시고 그냥 아무거나 골라서 사용하시면 됩
니다.
select나 poll에서 모두 두가지 다 이용 가능합니다. 이녀석들이 해주는것
은 디스크립터의 변화를 알려주는 역할만 하지 실제 읽어 들이거나 쓰는것
은 read나 send등이 담당을 하잖아요.
즐거운 하루 되세요.
댓글 달기