반응형
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
짜임새 있는그러나 그것은 효과가 없는 것처럼 보였습니다.
마이크로소프트 문서를 읽었는데 시간은 다음과 같습니다.DWORD
milliseconds의 숫자로, 그러나 또한 해야 할 다른 일이 있습니다, 만약 소켓이 사용하여 생성된다면.WSASocket
함수, 그 다음에dwFlags
매개 변수는 다음을 가져야 합니다.WSA_FLAG_OVERLAPPED
시간 초과가 제대로 작동하도록 설정된 특성입니다.그렇지 않으면 시간 초과가 적용되지 않습니다.
언급URL : https://stackoverflow.com/questions/13547721/udp-socket-set-timeout
반응형
'programing' 카테고리의 다른 글
npm 종속성의 경우 VS Build 도구를 설치한 후 PowerShell이 고착되고 설치 관리자 로그 파일에서 python을 설치하는 것을 아직 기다리고 있다고 표시됩니까? (0) | 2023.09.07 |
---|---|
MariaDB를 시작할 수 없는 이유는 무엇입니까? (0) | 2023.09.07 |
pl/sql 쿼리를 실행할 때 오버플로 오류를 가져오는 중 (0) | 2023.07.29 |
빔 위드 파워셸 (0) | 2023.07.29 |
matplotlib에서 색상표의 중간점 정의 (0) | 2023.07.29 |