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

标签 c++ multithreading sockets network-programming

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

相关文章:

c++ - 如何在调整窗口大小时调整 QListWidget 中项目的大小?

c++ - 类成员标识符的解析如何在 C++ 中工作

java - 正确调用 Hashmap 的 get() 和 put() 方法。

java - 一旦我按下Escape键,jvm就会崩溃

sockets - 什么时候需要 TCP 选项 SO_LINGER (0)?

c - 接收未知大小数据的最佳方法?

c++ - 如何静态断言多个类的公共(public)属性

c - pthread - sleep 阻止其他线程执行

Java初学者(客户端-服务器): Sending multiple Integers to a socket

c++ - CLION -- 如何为 CMakeLists.txt 文件中未提及的应用程序创建和调试配置