gpt4 book ai didi

c++ - 丢包超时 (UDP)

转载 作者:行者123 更新时间:2023-11-30 04:12:37 27 4
gpt4 key购买 nike

我正在尝试使用 select() 为 UDP 套接字传输创建超时。我想从 client 发送一个 intserver,等待 300ms,如果我没有收到 ACK,重新发送数据包。我不确定如何使用超时正确设置它。根据我在网上收集的内容和类里面的笔记,select 应该在接收端使用。

服务器端的客户端来回发送数字 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)

最佳答案

如果接收方超时,它需要告诉发送方,否则告诉发送方。换句话说,您必须实现基于 NACK 的协议(protocol)或基于 ACK 的协议(protocol)。

关于c++ - 丢包超时 (UDP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19761788/

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