【问题标题】:How to recv and send data on UDP socket on single client simultaneously如何同时在单个客户端上的 UDP 套接字上接收和发送数据
【发布时间】:2016-02-19 20:46:11
【问题描述】:

我必须在 udp 上实现选择性重复机制,因为它在 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++;

}`

【问题讨论】:

    标签: c++ multithreading sockets network-programming


    【解决方案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, &wfds) 后需要从 wfds 中移除 socket。因为当您在 wfds 中添加套接字并使用 select 进行轮询时,select 将始终发现该套接字是可写的,并将无限地发送数据,直到套接字关闭。仅当有数据可发送时,您必须将其设置为可写。在上述场景中,首先将其设置为可写,然后发送数据并将其从 wfds 中删除,然后继续等待 ACK

    【讨论】:

    • 当套接字发送缓冲区有空间时,它会发现它是可写的。这是大多数时候,但并非总是如此。
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2013-12-01
    • 2013-08-28
    相关资源
    最近更新 更多