我正在为网络类实现 Go Back N 协议。我正在使用 WaitForSingleObject 来了解接收器线程上的套接字何时在其中包含数据:
int result = WaitForSingleObject(dataReady, INFINITE);
对于 Go Back N,我必须一次向接收方发送多个数据包,并对数据进行操作,然后将 ACK 数据包发送回发送方。我有一个变量 expectedSEQ ,每次发送 ACK 时都会递增,以便知道数据包是否乱序到达。
但是,当第一个数据包到达时,我的调试器告诉我,expectedSEQ 已经增加,但是当处理下一个数据包时,expectedSEQ 仍然是它的原始值。
有人知道为什么会这样吗?如果我这样写一个 if 语句
if(recvHeader->seq == expectedSeq+1)
第二个数据包正确注册并发送确认。显然,这不适用于任何数量高于 2 的数据包。
我尝试将整个部分(包括原始的 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
}