gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:35:18 24 4
gpt4 key购买 nike

我正在用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com