gpt4 book ai didi

c - 在 UDP 上流式传输

转载 作者:行者123 更新时间:2023-12-04 06:15:29 25 4
gpt4 key购买 nike

我在这里有以下问题:我想在特定端口上的 UDP 套接字上写入服务器流数据,并且客户端应该能够连接到它并接收正在发送的数据而不会太麻烦:他们只是连接,从他们开始的那一刻起,他们应该使用 recvfrom 获取数据从服务器。

我在设置网络相关部分时遇到了一些问题。所以,这是我尝试编写的一段粗略的代码:

int udpSock = socket(AF_INET, SOCK_DGRAM, 0);
if(udpSock == -1)
{
perror("Could not create audio output socket");
exit(1);
}

struct sockaddr_in *sin = (struct sockaddr_in*)&gOutgoingAddr;
sin->sin_port = htons(40200);
if(bind(udpSock, (const sockaddr*)sin, sizeof(struct sockaddr_in)) == -1)
{
perror("Cannot bind audio socket");
exit(1);
}

int buffer_size = 0;
char* data = get_next_buffer(&buffer_size);
while(buffer_size > 0)
{
if(sendto(udpSock, (const void*)(data), buffer_size, 0, NULL, 0) == -1)
{
perror("sendto failure");
}
data = get_next_buffer(&buffer_size);
}

不用担心 gOutgoingAddr 变量,它是使用 getifaddrs 正确获得的。 ,是有效的。我对 sendto 的参数化感到困扰方法,因为现在应用程序的输出是:
sendto failure: Destination address required

这是真的,因为我没有目标地址,因为到目前为止我找到的所有示例都显示服务器何时获得客户端连接,并且有地址。但是由于我还没有连接客户端,我仍然想流式传输。

我感谢所有帮助,我不知道应该为 sendto 的参数设置什么:
  • gOutgoingAddress 是我创建套接字的地址?我试过这个,但如果我使用 tcpdump linux 命令在指定的端口上,我什么也没得到。
  • 我应该创建一个多播套接字吗?这在某种程度上毫无意义...
  • 还有什么?

  • 谢谢,
    frc

    最佳答案

    你不能流到“无处”。通过 UDP 流式传输数据不是多播。这意味着如果您连接了 100 个客户端,则必须将完全相同的数据发送 100 次,每次发送给每个将接收它的客户端。组播实际上并不是最初的 IPv4 设计的一部分。它是后来添加的,并未得到广泛支持。这与 IPv6 背道而驰,其中多播已成为初始设计的一部分。您唯一可以做的就是广播本地网络中的流量。这仅在所有客户端都在您的本地网段中时有效。要广播您的服务器,只需将数据发送到 255.255.255.255 和固定的 UDP 端口。然后所有客户端都必须监听该特定端口并接收数据。请注意,在大多数系统上,您需要特殊的广播权限(例如,仅允许以 root 权限运行的程序才能广播流量并不常见,因为广播会污染您的网络,因为所有广播数据包都会发送到网络中的所有客户端,无论他们是否关心他们)。没有广播,你只有单播,单播意味着一个发送者,一个接收者。对于一个发送者多个接收者,您必须多次向多个地址发送相同的数据。

    关于c - 在 UDP 上流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7308328/

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