我在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连接接收数据。
感谢任何帮助。
答案 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);
//...
}
}