gpt4 book ai didi

C UDP套接字: Arbitrary setsockopt behavior (with SO_RCVTIMEO)

转载 作者:行者123 更新时间:2023-11-30 17:29:48 34 4
gpt4 key购买 nike

SO_RCVTIMEO 根本没有在我的输出函数中创建超时条件。我正在使用 ARQ 滑动窗口协议(protocol)设计文件传输服务。为了保持一切有序,我从基本的“停等”开始。

这是我对 timeval 的初始化

    struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;

这是我在准备接收超时时使用该结构和套接字

if(setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))<0)
{
fprintf(stderr, "Error in socket option for Timeout mechanism: %s",strerror(errno));
close(sock);
exit(EXIT_FAILURE);
}

if (-1 == bind(sock,(struct sockaddr *)&sa, sizeof(sa)))
{
perror("error bind failed");
close(sock);
exit(EXIT_FAILURE);
}

这是应该超时的代码主体:

for(;;)
{
...
while((read_bytes=fread((char*)&(packet.body),sizeof(char),CHUNKSIZE,out_file))
{
...
while(1)
{
bytes_sent = sendto(sock, (struct sanpacket*)&packet, sizeof(struct sanpacket), 0,(struct sockaddr*)&sa, sizeof sa);
if (bytes_sent < 0)
{
fprintf(stderr, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("Waiting for ACK packet\n");

recsize = recvfrom(sock, (struct sanpacket*)&packet, sizeof(struct sanpacket), 0, (struct sockaddr*)&sa, &fromlen);
if(errno == EAGAIN)
{
printf("Timed out; resending packet with sequence number %d", packet.sequence_num);
continue;
}
if (recsize < 0)
{
fprintf(stderr, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}

}

问题:超时没有触发,但setsockopt也没有返回任何错误。我无法知道我做错了什么。

如果我还能做些什么来澄清我的问题或环境,请告诉我。如果您对调试有任何建议,我将不胜感激。

最佳答案

我忘记提及的背景是,这是在 Debian Linux 上编译的,而不是在我想使用的 Cygwin 平台上编译的。

所以我在思考这个非常棘手的问题。然后我想起了奥卡姆 Razor 并想,对于正在发生的事情,最简单、最基本的解释可能是什么?

事实证明,Cygwin 不支持setsockopt 超时。

我想说的是一个系统的必要性,让你可以在你生命中的几个小时内吸引开发人员,但这是无关紧要的,无论如何,Cygwin 也是一个很好的 Linux 模拟器。

关于C UDP套接字: Arbitrary setsockopt behavior (with SO_RCVTIMEO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25495361/

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