如何在单个客户端的UDP套接字上同时接收和发送数据

How to recv and send data on UDP socket on single client simultaneously

本文关键字:数据 单个 客户端 套接字 UDP      更新时间:2023-10-16

我必须在udp上实现selectiveRepeat机制,就像在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++;
}`
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,&wfd)之后,您需要从wfd中移除socket。因为当您在wfd中添加套接字并使用select进行轮询时,select将始终发现该套接字是可写的,并将无限发送数据,直到套接字关闭。如果有数据可供发送,则必须将其设置为仅可写。在上面的场景中,首先将其设置为可写,然后发送数据并将其从wfd中删除,然后继续等待ACK