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

时间:2015-11-18 08:03:02

标签: c++ multithreading sockets network-programming

我必须在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++;

}`

1 个答案:

答案 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