programing

UDP 소켓 세트 시간 초과

procenter 2023. 9. 7. 22:42
반응형

UDP 소켓 세트 시간 초과

UDP 소켓에서 100ms 타임아웃을 설정하려고 합니다.저는 C를 사용하고 있습니다.저는 아래에 제 코드의 관련된 부분들을 올립니다.왜 이것이 타임아웃이 아니라 세그먼트가 수신되지 않을 때 중단되는지 잘 모르겠습니다.bind() 메서드를 사용하여 바인딩되지 않은 소켓에서만 작동합니까?

#define TIMEOUT_MS      100     /* Seconds between retransmits */

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    DieWithError("socket() failed");

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    DieWithError("socket() failed");

//set timer for recv_socket
static int timeout = TIMEOUT_MS;
setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));

if(recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0,
       (struct sockaddr *) &servAddr2, &fromSize) < 0){
    //timeout reached
    printf("Timout reached. Resending segment %d\n", seq_num);
    num_timeouts++;
}

SO_RCVTIMEO옵션은 다음을 기대합니다.struct timeval에 정의된sys/time.h, 당신이 그것을 전달하는 것과 같은 정수가 아닙니다.timeval struct에는 seconds 필드와 microseconds 필드가 있습니다.타임아웃을 100ms로 설정하려면 다음 방법을 수행해야 합니다.

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
if (setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) {
    perror("Error");
}

저도 같은 문제가 있습니다.나는 당신이 제안한 해결책을 채택하려고 했습니다.timeval짜임새 있는그러나 그것은 효과가 없는 것처럼 보였습니다.

마이크로소프트 문서를 읽었는데 시간은 다음과 같습니다.DWORDmilliseconds의 숫자로, 그러나 또한 해야 할 다른 일이 있습니다, 만약 소켓이 사용하여 생성된다면.WSASocket함수, 그 다음에dwFlags매개 변수는 다음을 가져야 합니다.WSA_FLAG_OVERLAPPED시간 초과가 제대로 작동하도록 설정된 특성입니다.그렇지 않으면 시간 초과가 적용되지 않습니다.

언급URL : https://stackoverflow.com/questions/13547721/udp-socket-set-timeout

반응형