c++ - 如何在 C++ 中的一个应用程序中同时使用 TCP 和 UDP

标签 c++ sockets networking tcp udp

我正在用 C++ 开发一个基于 Winsock 的服务器-客户端项目。我设计了服务器端和客户端,以便它们也可以发送和接收文本消息和文件。

然后我决定在服务器和客户端之间进行音频通信。我实际上已经实现了它,但是我发现我已经使用 TCP 协议(protocol)完成了所有操作,而对于音频通信,最好使用 UDP 协议(protocol)。

然后我在互联网上进行了搜索,发现可以同时使用 TCP 和 UDP。

我尝试过使用 UDP 协议(protocol),但没有取得任何重大进展。

我的问题是我在 while 循环中同时使用 recv() 和 recvFrom(),如下所示:

while (true)
{
    buflen = recv(clientS, buffer, 1024, NULL);

    if (buflen > 0)
    {
        // Send the received buffer
    }
    else if (buflen == 0)
    {
        printf("closed\n");
        break;
    }

    buflen = recvfrom(udpS, buffer, 1024, NULL, (struct sockaddr*)&_s, &_size);

但是 recvFrom() block 。我认为我没有正确完成这项工作,但我找不到如何去做。

在这里Server in C accepting UDP and TCP connections我发现了一个类似的问题,但答案只是解释,没有示例代码可以清楚地说明这一点。

现在我需要你帮助我清楚地理解如何从 TCP 和 UPD 连接接收数据。

感谢任何帮助。

最佳答案

一次处理多个套接字时,使用select()在读取之前知道哪个套接字有待处理的数据,例如:

while (true)
{
    fd_set rfd;
    FD_ZERO(&rfd);
    FD_SET(clientS, &rfd);
    FD_SET(udpS, &rfd);

    struct timeval timeout;
    timeout.tv_sec = ...;
    timeout.tv_usec = ...;

    int ret = select(0, &rfd, NULL, NULL, &timeout);
    if (ret == SOCKET_ERROR)
    {
         // handle error
         break;
    }

    if (ret == 0)
    {
         // handle timeout
         continue;
    }

    // at least one socket is readable, figure out which one(s)...

    if (FD_ISSET(clientS, &rfd))
    {
        buflen = recv(clientS, buffer, 1024, NULL);
        if (buflen == SOCKET_ERROR)
        {
            // handle error...
            printf("error\n");
        }
        else if (buflen == 0)
        {
            // handle disconnect...
            printf("closed\n");
        }
        else
        {
            // handle received data...
        }
    }

    if (FD_ISSET(udpS, &rfd))
    {
        buflen = recvfrom(udpS, buffer, 1024, NULL, (struct sockaddr*)&_s, &_size);
        //...
    }
}

关于c++ - 如何在 C++ 中的一个应用程序中同时使用 TCP 和 UDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27679809/

相关文章:

c++ - 如何将函数指针(我们不知道参数的函数)声明为类成员?

c++ - 是否可以从其他线程隐藏 qt 小部件窗口?

c++ - STL算法删除容器中的所有对象?

c++ - 为什么 scanf 似乎跳过了输入?

Python 原始套接字到以太网接口(interface) (Windows)

android - 建立 VPN 连接会将 NetworkCapabilities.TRANSPORT_WIFI 设置为 false?

java - 电话在3G上时套接字超时,在Wifi上时起作用,为什么?

swift - 如何从套接字获取数据并制作 protobuf 文件?

python - 将应用程序从主机移至 Docker 会使 HTTP 延迟增加 5 秒

linux - 可以在不同的 CPU 内核上执行相同网络数据包的硬和软 IRQ 吗?