2013-11-04 77 views
1

我正在嘗試使用select()爲UDP套接字傳輸創建超時。我想發送intclientserver,等待300ms,如果我沒有收到ACK,請重新發送數據包。我不確定如何在超時時間內正確設置它。從我在線收集的內容以及我在課堂上收到的筆記中,應該在接收端使用select丟失數據包超時(UDP)

服務器上的客戶端來回發送數字1-100。我有一個單獨的router模擬代碼,隨機丟棄數據包

下面是代碼我有用於客戶端側

int sent = 1; 
int received = 1; 

    for (int i = 0; i < 100; i++) 
    { 
     string sent1 = to_string(sent); 
     char const *pchar = sent1.c_str(); 
     if(!sendto(s, pchar, sizeof(pchar), 0, (struct sockaddr*) &sa_in, sizeof(sa_in))) 
      cout << "send NOT successful\n"; 
     else 
     { 
      cout << "Client sent " << sent << endl; 
      sent++; 
     } 
     // receive 
     fd_set readfds; //fd_set is a type 
     FD_ZERO(&readfds); //initialize 
     FD_SET(s, &readfds); //put the socket in the set 

     if(!(outfds = select (1 , &readfds, NULL, NULL, & timeouts))) 
      break; 
     if (outfds == 1) //receive frame 
     { 
      if (!recvfrom(s, buffer2, sizeof(buffer2), 0, (struct sockaddr*) &client, &client_length)) 
       cout << "receive NOT successful\n"; 
      else 
      { 
       received = atoi(buffer2); 
       cout << "Client received " << received << endl; 
       received++; 
      } 
     } 
    } 

的代碼是在接收側,除了它是在反向相同:第一接收,然後發送

我的代碼根本沒有利用超時。這基本上就是我想做的事:

send packet(N) 
    if (timeout) 
     resend packet(N) 
    else 
     send packet(N+1) 
+0

Udp表示*不可靠*數據報協議。它不會執行或重新發送。你必須自己實現。這裏的發送超時是將數據包推送到有線或網絡堆棧上丟棄它。 – kfsone

回答

2

如果接收端收到超時它需要轉告寄件人,否則轉告寄件人。換句話說,您必須實現基於NACK的協議或基於ACK的協議。