簡體   English   中英

在套接字上設置超時不起作用

[英]Setting a timeout on a socket is not working

我正在使用setsockopt()函數在recvfrom()函數上設置超時。 由於我使用的協議,我必須首先具有2秒的超時時間,然后是4、6,直到最大時間。 但是當我使用該功能時,它似乎有0.01秒的超時,因為它發送了8個數據包而沒有等待。

//more variables and code here
struct timeval timeout = {2,0};

while(1){
  setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval));
  temp2 = recvfrom(sock, &buff, sizeof(buff), 0, (struct sockaddr *)&addr_server, sizeof(addr_server));

  if(temp2 < 0){ /* Timeout excedit (exceeded)*/
      temp = sendto(sock, (struct udp_PDU*)&reg_pdu, sizeof(reg_pdu), 0, (struct sockaddr *)&addr_server, sizeof(addr_server));
      if(temp == -1){
        printf("Error sendTo \n");
        exit(-1);
      }
      packet_counter++;
      debug("Enviat paquet REGISTER_REQ");
      if(packet_counter == 8) break;
      if((interval * max) > t ) timeout.tv_sec+=interval;

  }else{ /* s'han rebut dades (they have rebooted) */
    correct = 1;
    break;
  }
}

超時(例如您要實現的超時)不是延遲語句。 相反,它是一種防止無限期阻止諸如recv()recvfrom()的調用的方法。 如果數據流量的顯示時間早於設置的超時時間,那么情況會更好。 該函數接收它,然后程序流程繼續。 超時,您需要等待2秒鍾才能發生。 如果什么也沒有發生,則它允許方法停止等待,並讓您的程序繼續執行,即不會阻塞。 沒有超時,諸如recv()recvfrom()類的函數可能會永遠阻塞。

如果要在對recvfrom()sendto()調用之間強制2秒的間隔(或阻塞 sendto() ,請放置sleep(2); (或者在Windows中為Sleep(2000); )語句,該語句可能在循環的某個位置,可能在底部。

while(1){
    ...
    }
    sleep(2);  //or on Windows, Sleep(2000);
}

順便說一句,習慣性地檢查具有一個函數的任何函數的返回值也是一個好主意,尤其是如果該函數的失敗會嚴重破壞代碼的其余部分。 例如:

if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)) < 0) {
    perror("Error");
}
...

一些與主題相關的方面:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM