저도 맨날 여기서 질문만 올리는데
모처럼 아는거 나와서 답변을 적어봅니다.
혹시나 틀린거 있으면 답변주시길..
제가 회사에서 만든것인데요
아니..만들었다기 보다는 스티븐스 아저씨책에서 약간 수정한거
아니.....거의그대로 가져다 -.- 썼어요
connect() 함수에 타이머 걸기가 어렵게 느껴지는 이유는
connect() 함수가 블럭킹되는 함수이기 때문입니다.
이를 해결하기 위해서...
connect() 함수로 연결을 기다리기 전에
소켓을 non-block 모드로 설정한후에
connect() 호출합니다. 그러면 connect()가 즉시 리턴하거든요, 연결이 되든 안되든...
그후 select()를 호출하면 됩니다.
non-block 소켓이 연결되거나, 타임아웃이 되면 select() 함수가 리턴합니다.
select() 함수의 리턴값을 보고, 연결되었는지 타임아웃인지를 확인할수 있습니다.
그니깐 순서가..
1. 소켓을 non-block 으로 설정
2. connect() 호출--- 즉시 리턴
3. select()로 타임아웃을 기다림
4. 소켓의 non-block 을 해제
man setsockopt여기서 SO_RCVTIMEO 이부분을 보시면
man setsockopt
여기서 SO_RCVTIMEO 이부분을 보시면은 원하는 대답이 될듯 하네요.
<어떠한 역경에도 굴하징 낳는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
스티븐스아저씨 책보고 약간 수정한거
저도 맨날 여기서 질문만 올리는데
모처럼 아는거 나와서 답변을 적어봅니다.
혹시나 틀린거 있으면 답변주시길..
제가 회사에서 만든것인데요
아니..만들었다기 보다는 스티븐스 아저씨책에서 약간 수정한거
아니.....거의그대로 가져다 -.- 썼어요
connect() 함수에 타이머 걸기가 어렵게 느껴지는 이유는
connect() 함수가 블럭킹되는 함수이기 때문입니다.
이를 해결하기 위해서...
connect() 함수로 연결을 기다리기 전에
소켓을 non-block 모드로 설정한후에
connect() 호출합니다. 그러면 connect()가 즉시 리턴하거든요, 연결이 되든 안되든...
그후 select()를 호출하면 됩니다.
non-block 소켓이 연결되거나, 타임아웃이 되면 select() 함수가 리턴합니다.
select() 함수의 리턴값을 보고, 연결되었는지 타임아웃인지를 확인할수 있습니다.
그니깐 순서가..
1. 소켓을 non-block 으로 설정
2. connect() 호출--- 즉시 리턴
3. select()로 타임아웃을 기다림
4. 소켓의 non-block 을 해제
머 이런순으로 되겠죠
책보면 다나오는 것이지만... 혹시나 고수님들의 딴지를 기대하며
제가 작성한 소스를 올려봅니다.
님이 궁금해하시는 소스는 connect_nonb() 부분일겁니다.
시원하네요.
정말 가려운데 손이 안닿는 곳을
아주 시원하게 긁어 주는 글이었습니다.
감사해요~
better tommrow than yesterday - cs. shin.
better tommrow than yesterday - cs. shin.
적정한 타임아웃 시간을 어느정도 일까요?
올려주신 소스 애용 중 입니다. ^^
제가 클라이언트 측이고, 서버에 접속하는데, 끊어졌다고 판단하면 1초당 한번씩 재접 시도 합니다.
근데 처음에는 usec(timeout 시간)을 5000 마이크로 sec 정도 주었었는데, 테스트를 위해서 네트워크
케이블 플러그를 강제로 뺀 상태에서도 가끔 연결되었다고 인지하곤 합니다.
로그 찍어보니 wset, rset 값이 변하더라구요.
시간을 500,000 마이크로 sec 정도 주니 안정화 되기에 충분한 시간이라서 그런지
케이블 뺀 상태에서 연결완료로 인지하진 않았습니다. 하지만 10분에 한건 정도는 발생하는 듯 하네요.
시간을 0.5초에서 더 주어야 할까요??? 이정도면 블라킹 처리할때와 크게 다르지 않겠네요.
뭐가 문제인지...
SIGALRM으로 튕겨내는건 어떤가요? alarm() 쓰면 됩니다.
SIGALRM으로 튕겨내는건 어떤가요? alarm() 쓰면 됩니다.
스레드 안쓴다면 가장 간단한 방법이죠.
Written By the Black Knight of Destruction
Re: 스티븐스아저씨 책보고 약간 수정한거
:D
Life rushes on, we are distracted
bw001730님의 답변과 흑기사님의 답변이 connection time
bw001730님의 답변과 흑기사님의 답변이 connection timeout을 주는 방법입니다.
이는 아마도 unp에도 나와 있을테고,
socket faq를 보셔도 두가지 답변이 함께 기술되어 있습니다.
alarm을 쓰실 수 있는 경우라면 그게 간단한 해결책이 되겠지요.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
alarm(5);connect(...);alarm(0);알
alarm(5);
connect(...);
alarm(0);
알람을 5초로 걸고 5초안에 alarm(0)을 통해서 해제를 못하게 되면
connect() 함수 블럭 상태에서 자동으로 알람핸들러 함수가 호출되게 됩니다.
connect()는 인터럽트 되게 되고 알람핸들러에서 적당한 처리를 해주시거나
그냥 두시면 됩니다.
정상적으로 connect()에서 연결이 되면 alarm(0)으로 해제가 됩니다.
유닉스 관련 서적에서 시스템콜 alarm 을 보시면 예제들이 있을거에요.
------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.
감사드립니다. 글을 늦게 확인했습니다 ^^;:)
감사드립니다. 글을 늦게 확인했습니다 ^^;
:)
댓글 달기