accept와connect의 시간 초과 설정
2076 단어 socketaccept 시간 초과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 시간 초과를 설정합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React 구성 요소에서 소켓 이벤트 리스너가 여러 번 실행됩니다.기본적이지만 종종 간과되는 사이드 프로젝트를 하면서 배운 것이 있습니다. 이 프로젝트에는 단순히 두 가지 주요 부분이 포함되어 있습니다. 프런트 엔드: 반응 및 재료 UI 백엔드: Express, Typescript...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.