我必须在 udp 上实现 selectiveRepeat 机制,就像在 TCP 中一样。因此,在这方面,我将向客户端发送我的窗口,同时期待对已发送数据的确认...我正在尝试如下所示执行此操作...但在此代码中它发送数据但不接收任何确认.......任何人都可以帮助
`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++;
}`
最佳答案
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, &wfds) 后需要从wfds 中移除socket。因为当您在 wfds 中添加套接字并使用 select 进行轮询时,select 将始终发现该套接字可写,并将继续无限发送数据直到套接字关闭。只有当有数据可发送时,您才必须将其设置为可写。在上面的场景中,首先设置为可写,然后发送数据并从wfds中删除,然后一直等待ACK
关于c++ - 如何在单个客户端上同时在 UDP 套接字上接收和发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33774581/