簡體   English   中英

為什么在WaitForSingleObject之后我的變量不保持狀態?

[英]Why aren't my variables holding state after WaitForSingleObject?

我正在為網絡課程實現Go Back N協議。 我正在使用WaitForSingleObject來了解接收器線程上的套接字何時在其中包含數據:

int result = WaitForSingleObject(dataReady, INFINITE);

對於“返回N”,我必須一次將多個數據包發送到接收方,並處理數據,然后將ACK數據包發送回發送方。 我有一個變量ExpectedSEQ,每次發送ACK時我都會遞增,以便知道數據包是否到達混亂。

但是,當第一個數據包到達時,我的調試器會告訴我ExpectedSEQ已經增加,但是當操作下一個數據包時,ExpectedSEQ仍然是其原始值。

有人知道為什么會這樣嗎? 如果我這樣寫一個if語句

if(recvHeader->seq == expectedSeq+1)

第二個數據包正確注冊並發送一個ack。 顯然,這對於大於2 tho的任何數量的數據包均不起作用。

我嘗試將整個部分(包括原始的WaitForSingleObject)包裝在一個信號量中,以嘗試使所有內容都等到變量增加之后,但這也不起作用。

謝謝你的幫助!

埃里克

每個請求:更多代碼!

WaitForSingleObject(semaphore, INFINITE);
int result = WaitForSingleObject(dataReady, timeout);
if(result == WAIT_TIMEOUT)
   rp->m->printf("Receiver:\tThe packet was lost on the network.\n");
else {
  int bytes = recvfrom(sock, recv_buf, MAX_PKT_SIZE, 0, 0, 0);
  if(bytes > 0) {
   rp->m->printf("Receiver:\tPacket Received\n");
   if(recvHeader->syn == 1 && recvHeader->win > 0)
       windowSize = recvHeader->win;

   //FORMER BUG: (recvHeader->syn == 1 ? expectedSeq = recvHeader->seq : expectedSeq = 0);
   if(recvHeader->syn)
      expectedSeq = recvHeader->seq;
   switch(rp->protocol) {
      case RDT3:
         ...
      break;
      case GBN:
         if(recvHeader->seq == expectedSeq) {
            GBNlastACK = expectedACK;
            //Setup sendHeader for the protocol
            sendHeader->ack = recvHeader->seq;
            ...
            sendto(sock, send_buf, sizeof(send_buf), 0, (struct sockaddr*) &send_addr, sizeof(struct sockaddr_in));
            if(sendHeader->syn == 0) { //make sure its not the first SYN connection packet
               WaitForSingleObject(mutex, INFINITE);
               expectedSeq++;
               ReleaseMutex(mutex);
               if(recvHeader->fin) {
                  fin = true;
                  rp->m->printf("Receiver:\tFin packet has been received. SendingOK\n");
               }          
            }
         }
    break;
    }//end switch
}

確切地說,如何以及何時增加expectedSeq 有可能是參與,所以你可能需要訪問一個內存屏障問題expectedSeq臨界段內(或保護其他一些同步對象),或使用Interlocked API來訪問變量。

例如,編譯器可能正在expectedSeq ExpectedSeq的值緩存在寄存器中,因此可能需要同步API來防止在代碼的關鍵區域發生這種情況。 請注意,使用volatile關鍵字似乎有幫助,但可能還不夠用(盡管MSVC可能會用,因為Microsoft的編譯器在處理volatile對象時會使用完整的內存屏障)。

我認為您需要發布更多代碼,以准確顯示您如何處理expectedSeq

當我輸入代碼(由於我的代碼在另一台計算機上而需要手動鍵入)時,我在為ExpectedSeq設置原始值時意識到了一個非常愚蠢的錯誤。 每次運行數據包時,我都將其設置為0。

不得不愛編碼直到凌晨5點才出來的代碼!

暫無
暫無

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

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