accept와connect의 시간 초과 설정

연결 시간 초과:
우리는 모두 알다시피connect는 세 번의 악수 중 첫 번째 SYN을 보내야 하고 서버의 ACK를 대해야 한다. 만약 서버가 서버를 시작하지 않았다면 어떤 기계는 즉시 RST로 돌아가 서버가 거부를 표시하여connect가 실패했다는 것을 나타낸다. 그러나 또 다른 서버는 공격을 방지하기 위해 아무것도 보내지 않는다. 클라이언트connect가 시간을 초과할 때까지 이 시간은 75s로 클라이언트에게 받아들일 수 없다.그래서 연결의 시간 초과 시간을 설정해야 합니다.
select를 사용하여 connect의 시간 초과 설정:
<span style="white-space:pre">	</span>uint32_t ul = 1;
	ioctl(sock, FIONBIO, &ul);// 
	printf("start time: %u
", time(0)); bool success = false; if (connect(sock, (sockaddr *)&srv_addr, sizeof srv_addr ) == -1) { <span style="white-space:pre"> </span>struct timeval tm; tm.tv_sec = 3; tm.tv_usec = 0; <span style="white-space:pre"> </span>fd_set set; FD_ZERO(&set); FD_SET(sock, &set); if (select(sock + 1, NULL, &set, NULL, &tm) > 0) { int error = 0; int len = sizeof(int); getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len); if (0 == error) success = true; } else { success = false; } } ul = 0; ioctl(sock, FIONBIO, &ul); //

accept 시간 초과:
절반은 서버가 accept 상태일 뿐만 아니라 accept 시간 초과를 설정할 필요가 없지만 일부 특수한 상황은 여전히 필요하다.accept에 대해 우리는 select 다중 복용을 사용하여 시간 초과 설정을 실현할 수 있지만, 그 코드는 비교적 많다.그럼 다른 방법이 없을까요?우리는 accept가 세 번의 악수에서 서버가 SYN을 수신하도록 지정했습니다. 그러면 recv 시간 초과를 설정해서 accept 시간 초과를 실현할 수 있습니까?답은 긍정적이다.
struct timeval timeout = {6,0};
if (setsockopt(proxy_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval)) != 0)
{
	printf("set accept timeout failed");
}
sock = ::accept(proxy_sock, (sockaddr *)NULL, NULL);

recv 시간 초과로 accept 시간 초과를 설정할 수 있는 이상,connect에 대해send 시간 초과를 설정하여connect 시간 초과를 실현할 수 있습니까?정답은 확실해!!!
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(struct timeval));

connect와 accept를 세 번의 악수 과정에 대응하면 이해하기 어렵지 않다.
요약:
우리는 SO_를 설정할 수 있습니다RECVTIMEO 및 SO_SENDTIMEO는 accept 시간 초과와 connect 시간 초과를 설정합니다.

좋은 웹페이지 즐겨찾기