2013-03-18 2 views
0

안녕하세요, UDP 연결로 클라이언트의 패킷을 기다리는 프록시 서버를 만들고, 모두가 실제로 도착했는지 또는 같은 것이 거부되었는지 확인합니다.UDP 소켓에서 select()를 사용합니다.

그럴 경우 각 잃어버린 패킷 (send_ack())과 함께 클라이언트에게 "ack"를 보내야합니다.하지만 얼마 지나지 않아 무한대의 acks를 보내지 않는 select 루프의 "if 부분"을 보냈습니다. 은 "다른 부분"에 선택이 조언에 대한 클라이언트의 데이터 (_pkt() 함수를 수신)

fd_set rset, allset; 
int maxfd, nready; 
struct timeval timeout; 

timeout.tv_sec = 4; 
timeout.tv_usec = 150000; 
maxfd = socketfd; 
FD_ZERO(&allset); 
FD_SET(socketfd, &allset); 
rset = allset; 

for(i=0; ;i++){ 
    do { 
     nready=select((maxfd +1), &rset, NULL, NULL, &timeout); 
    } while ((nready<0) & (errno==EINTR)); 

    if(nready<0) { 
     perror("Error main: select failed: "); 
     exit(32); 
    } 
    if(nready==0){ 
     send_ack(socketfd,head); 
    } 
    else{   
     receive_pkt(socketfd, head); 
    } 
} 

은 분명히 충분 희망, 감사를들을 수 있었다!

+1

실제 질문은 무엇입니까? – Jelmer

+0

어떻게이 루프를 벗어날 수 있을까요? : "첫 번째 확인을 보낸 후에"선택 부분 "이 무제한 확인을 보내고 절대로"else 부분 "으로 돌아 가지 않을 것입니다. 클라이언트의 선택 수신 데이터입니다 (수신 _pkt() 기능) " – nirva

답변

2

일부 시스템 (특히 Linux)에서는 select 호출이 제한 시간을 수정하여 남아있는 시간을 표시합니다. 그래서 당신의 경우 3 초 동안 패킷을 대기하면 타임 아웃은 1.15 초로 줄어들고 총 4.15 초 후에 타임 아웃은 0이 될 것이므로 나중에 select을 호출하면 nready == 0으로 즉시 복귀하게됩니다.

ack을 보낸 후에 다시 대기하려면 제한 시간을 0이 아닌 값으로 재설정해야합니다.

2

select을 호출하기 전에 fd_set rset을 재설정해야합니다. select 호출은 판독 할 통지가있는 필드 설명 자의 비트 세트를 모니터하고 겹쳐 쓰도록 필드 설명자 세트를 예상합니다.

for(i=0; ;i++){ 
    do { 
     rset = allset; 
     nready=select((maxfd +1), &rset, NULL, NULL, &timeout); 
    } while ((nready<0) & (errno==EINTR)); 
+0

고마워요! 지금 그것이 효과가있다! – nirva