[완료] 서버측 메세지 송신을 클라이언트에서 감지.
글쓴이: zipsinworm / 작성시간: 금, 2007/07/06 - 2:40오후
안녕하세요. 오늘도 열심히 내공을 쌓기 위해 생각하고 또 생각하고 있는 리눅스 매니아 입니다.
서버측 메세지가 클라이언트 측으로 오는 것을 알 수 있는 방법이 있지 않나 궁금해서 이렇게 글을 올립니다.
윈도우즈에서는 이벤트를 사용해 서버에서 날라오는 메세지를 감지할 수 있지만,
리눅스에서는 똑같지는 않지만 서버에서 오는 메세지를 클라이언트가 알 수 있지 않을까요? (소켓을 본다거나...등등)
전제 조건은 서버 메세지가 언제 끝나는지 알 수 없다라는 겁니다.(이건 신경안쓰셔도 되요.)
아무리 생각을 해봐도 답이 나오지 않습니다. 혹시 알고 계신분들 방법을 전수해주세요.
Forums:
서버에서 날아오는
서버에서 날아오는 메시지라는게 어떤 의미인가요?
소켓을 통해서 전송되는 데이터인가요?
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
메시지는
서버에서 날아오는 메시지는 소켓을 통해 전송되는 데이터입니다.
소켓을 감시해서 데이터가 오는것을 보고 싶은데 리눅스에서는 그런 함수는 존재하지 않는거 같더군요.-0-;;
select() ?
select() ?
========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux
임베디드 리눅스 관련 프리렌서 지향
여러개의 소켓을
여러개의 소켓을 감시하실려면 select함수를 이용하시거나..
아니면 그냥 recv함수를 호출하면 데이터가 올때까지 블럭됩니다.
참고로 tcp는 스트림 방식이므로 상대방이 100바이트를 보냈다 하더라도 받는쪽에서 recv가 리턴 할 당시 채워지는 데이터 크기는 50바이트가 될수도 있고 70바이트가 될수도 있습니다. 이럴때는 recv가 리턴하는 값(실제 받은 바이트수)을 가지고 원하는 크기인 100이 안왔다면 recv를 재호출하여 대기 하시면 됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
select함수
지금 select함수를 사용해보았습니다. 근데 이상하게도 select함수에서 블럭되고 다음으로 넘어가지 않는군요. -0-;
넘어가지 않는다는 말은 소켓을 감지하지 못했다는건데, 메시지는 서버가 계속 보내주고 있었습니다.
여러 소켓을 생성하고 하나의 쓰레드에서 각각의 소켓에서 오는 서버 메시지를 받을려고 select를 썻습니다.(우선은 한 소켓만 실험하고 있습니다.)
[select함수 사용 -> 해당 소켓에서 recv함수 호출 ] 이런 방식입니다.
이미 서버 메세지가 도착한 상태에서 select를 호출하게 되면 감지하지 못하는 걸까요?
실시간 리플 좋네요^^
리눅스 네트웍 개발
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
select() 함수는
FD_CLR()
FD_SET()
time_out 변수를 사용하여야 합니다.
fd_set readfds;
와 같이 등록된 fd를 비교하게 위한 변수도 필요하지요.
select를 사용한 프로그램은 고급기능으로 생각되어서 인지
많이 찾아 볼수가 없지요.
"유비쿼터스 네트워크 실무" 성안당 책을 보시면 잘정리 되어 있습니다.
여기 사이트 가면 쉽게 정리된 리눅스 TCP/IP 소스를 얻을수 있습니다.
http://www.devpia.com/UBIQUITOUS.MAEUL
네트워크 통신 리눅스 소스 모두 있어요.
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
epoll함수
답변해신분들 정말 감사합니다. 나름대로 고민을 많이 했는데 역시 답글해주신 분들 의견을 참고로 하니 잘 풀리네요..^^
다시한번 감사드립니다.
아! 쓰레드 안에서 epoll함수를 사용해 지속적으로 루프로 돌면서 감지를 하니까 해결이 되네요.
아쉬운점은 루프 안에서 epoll_wait가 블록킹되어있다가 소켓이 감지되는 순간 해제되면 좋겠지만
아무리 해도 그렇게 되지가 않네요. 지속적으로 돌기만 한다는거..-0-;;
댓글 달기