gpt4 book ai didi

c++ - 为什么我的变量在 WaitForSingleObject 之后没有保持状态?

转载 作者:行者123 更新时间:2023-11-30 18:08:00 25 4
gpt4 key购买 nike

我正在为网络类实现 Go Back N 协议(protocol)。我使用 WaitForSingleObject 来了解接收器线程上的套接字何时包含数据:

int result = WaitForSingleObject(dataReady, INFINITE);

对于 Go Back N,我必须一次向接收方发送多个数据包,并操作数据,然后将 ACK 数据包发送回发送方。我有一个变量预期SEQ,每次发送 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
}

最佳答案

具体如何以及何时增加 expectedSeq?可能涉及内存屏障问题,因此您可能需要访问关键部分内的 expectedSeq(或受其他同步对象保护)或使用 Interlocked API 来访问变量。

例如,编译器可能会将 expectedSeq 的值缓存在寄存器中,因此可能需要同步 API 来防止在代码的关键区域发生这种情况。请注意,使用 volatile 关键字可能看起来有帮助,但它也可能并不完全足够(尽管它可能与MSVC一起使用,因为微软的编译器在处理 volatile 时使用完整的内存屏障> 对象)。

我认为您需要发布更多代码来准确显示您如何处理expectedSeq

关于c++ - 为什么我的变量在 WaitForSingleObject 之后没有保持状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4017131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com