我必须在udp上实现selectiveRepeat Mechanism,因为它在TCP中。因此,在这方面,我将把我的窗口发送到客户端,同时将期待确认发送数据...我正在尝试这样做,如下所示...但在此代码中它发送数据但不接收任何ack .......任何人都可以帮助
`fd_set rfds;
fd_set wfds;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
FD_SET(socket, &rfds);
FD_SET(socket, &wfds);
while( FBS < LBS )
{
int result = select(socket+1, &rfds, &wfds, NULL, &timeout);
if(FD_ISSET(socket, &rfds))
{
Recieve();
}
if(FD_ISSET(socket, &wfds))
{
Send( "Some data");
}
FBS++;
}`
答案 0 :(得分:1)
fd_set rfds;
fd_set wfds;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
FD_SET(socket, &rfds);
FD_SET(socket, &wfds);
while( FBS < LBS )
{
int result = select(socket+1, &rfds, &wfds, NULL, &timeout);
if(FD_ISSET(socket, &rfds))
{
Recieve();
FD_SET(socket, &wfds); //set socket wirtable
}
if(FD_ISSET(socket, &wfds))
{
Send( "Some data");
FD_CLR(socket, &wfds); // reset socket writable
}
FBS++;
<强>更新强>:
发送数据FD_CLR(socket,&amp; wfds)后,需要从wfds中删除套接字。因为当你在wfds中添加套接字并使用select进行轮询时,select会始终发现该套接字是可写的并且将继续无限地发送数据,直到它关闭的套接字。只有在有可用于发送的数据时才必须将其设置为可写。在上面的场景中,首先将其设置为可写,然后发送数据并从wfds中删除它,然后继续等待ACK