C UDP流媒体

C UDP流媒体,c,networking,streaming,udp,posix,C,Networking,Streaming,Udp,Posix,我这里有以下问题:我想在特定端口上的UDP套接字上编写一个服务器流数据,客户端应该能够连接到它并接收发送的数据,而不需要太多麻烦:他们只是连接,从开始的那一刻起,他们应该使用recvfrom从服务器获取数据 我在设置网络相关部分时遇到一些问题。下面是一段粗略的代码,我想让它发挥作用: int udpSock = socket(AF_INET, SOCK_DGRAM, 0); if(udpSock == -1) { perror("Could not create audio output

我这里有以下问题:我想在特定端口上的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);
}
不要担心goutgoingadr变量,它是使用
getifaddrs
正确获取的,它是有效的。我对
sendto
方法的参数化感到困扰,因为现在应用程序的输出是:

sendto failure: Destination address required
这是真的,因为我没有目标地址,因为我找到的所有示例都显示了服务器何时获得客户端连接,并且有地址。但由于我还没有连接到客户机,所以我还是想退出

感谢所有帮助,我不知道sendto的参数应该是什么:

  • gOutgoingAddress是我创建套接字的地址?我已经试过了,但是如果在指定的端口上使用
    tcpdump
    linux命令,我什么也得不到
  • 我应该创建一个多播套接字吗?这不知何故毫无意义
  • 还有别的吗
  • 谢谢,
    frc

    顺便问一下,什么是audioUdpSock?
    你不应该改用udpSock吗?

    在你的服务器上做一个
    recvfrom
    ,让客户端发送一条消息(无论你想要什么内容,这只是建立连接的一种方式,一种问候语)。然后服务器将从
    recvfrom
    中获得客户机地址,并可以向其发送数据包

    由于UDP套接字的连接较少(使用UDP套接字时不需要
    accept
    connect
    ),因此需要有另一种方式通知服务器客户端的存在(客户端需要有一种越界的方式来知道服务器地址,通常是用户提供的,或者是硬编码的)

    如果您可以有多个客户端,则必须使用
    select
    poll
    。。。在套接字上,了解何时可以安全地无阻塞地调用
    recvfrom
    (或者可以将套接字配置为非阻塞)


    编辑:我向大家强烈推荐,对于您的问题,您可以直接转到的示例用法。

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

    问题编辑:)audioUdpSock是udpSock,我只是删掉了原始源代码,扔掉了与问题无关的所有内容OK:)我没有抓住重点。您正在尝试流式传输,但没有任何地址?或者当请求到来时,您正试图流式传输到某个地址?我正在尝试流式传输,但我没有地址。我希望多个客户端能够连接到我的服务器,并从它们连接的点开始接收数据。我明白了。我实际上不知道服务器做什么,但IGMP snooping为您做了这件事。另一种方法是:您可以监听客户端的套接字,然后获取地址和流到它。许多(如果不是大多数)现代路由器都支持多路广播。可能是互联网服务提供商不支持它。例如,请看,我在回答中并不是指主干互联网路由器。我指的是家庭和小型办公室网络中的典型设备,它没有IPv4多播支持,撇开它也没有第2层(以太网)多播支持,而是使用广播作为多播地址。