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

时间:2014-12-28 19:21:29

标签: c++ sockets networking tcp udp

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

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

然后我通过互联网搜索了一下,发现可以同时使用TCP和UDP。

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

我的问题是我在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()阻止了。我觉得我还没有完成这项工作,但我无法知道该怎么做。

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

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

在一次处理多个套接字时,使用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);
        //...
    }
}