Tag: 广播

使用win32 API在C中广播UDP套接字

我使用UDP套接字创建了一个客户端服务器应用程序。 应用程序工作正常,因为只有一个服务器和一个客户端。 但现在我想让我的服务器“广播”。 我怎么能这样做? 我一直试图这样做但它在BIND函数中出错并返回错误“10049”。 这是我的代码片段: #define broadcastPort 8888 WSADATA wsa; SOCKET s; //Initialise winsock printf(“\nInitialising Winsock…”); if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) { printf(“Failed. Error Code : %d”,WSAGetLastError()); exit(EXIT_FAILURE); } printf(“Socket Initialised.\n”); //Create a socket if((s = socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP )) == INVALID_SOCKET) { printf(“Could not create socket : %d” , WSAGetLastError()); } printf(“Socket […]

发送广播服务器 – >客户端和发送回客户端 – >服务器UDP C套接字

我想询问是否有可能,以及如何从UDP服务器向客户端发送广播,然后从客户端向服务器发回响应。 我需要实现一个应用程序,其中服务器在子网上发送广播 ,客户端应该以某种方式接收该消息,并以这种方式获取服务器地址,以便他们可以将一些消息发送回服务器。 我创建了一个带有指定服务器端口的套接字,例如2000,并将setsockopt设置为SO_BROADCAST并使用sendto发送了一些消息,但我的客户端永远挂起了recvfrom 。 好像它没有从服务器的广播中收到任何东西。 如何解决这个问题? 服务器: struct sockaddr_in addr; int socketfd,t=1; socketfd = socket(PF_INET,SOCK_DGRAM,0); memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(“2000”); addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); if (setsockopt(socketfd, SOL_SOCKET, SO_BROADCAST ,&t, sizeof(t))) ERR(“setsockopt”); if(bind(socketfd,(struct sockaddr*) &addr,sizeof(addr)) < 0) ERR("bind"); char *buf = "HelloFromServer!"; if(sendto(socketfd, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr)) <= […]

用于LAN计算机发现和服务器设置的UDP广播

我正在开发一个小型的网络游戏原型,它将使用UDP在局域网上播放。 为了发现网络上的其他计算机,我一直在调查广播。 但是,我仍然不确定有关UDP套接字设置/使用的一些细节(网络新手)。 我发现在游戏开始后可以使用一个很好的库,但首先,必须发现所有运行游戏的计算机,并且必须选择一个作为服务器。 所以我的问题如下: 可以使用单个UDP套接字来监听和发送广播吗? 我很确定答案是肯定的,但我想validation它。 使用UDP时,你真的必须使用bind()吗? 据我所知, connect()不是必需的,也不是send()/recv() ,因为它们是用于TCP( sendto()/recvfrom()作为替换)。

接收来自N个客户端的响应,以响应UDP上的广播请求

我正在为特定类型的网络多媒体设备实现一种IP查找器。 我想找出局域网中所有类型的活动设备,包括它们的IP地址和其他细节。 该设备有自己的设备发现方式。 它的工作原理如下:客户端通过UDP通过LAN发送广播请求。 目标端口号是固定的。 作为回应,LAN中理解此请求格式的所有服务器都将响应此请求,提供有关自身的信息。 我正在使用sendto()广播UDP请求消息。 现在我的问题是我不知道有多少设备(ieservers)会响应请求。 我需要多少次调用recvfrom()? 我什么时候才能知道我已经处理了所有设备的响应? 或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗? 有没有更好的(或者如果我错在这里是正确的)完成相同的方式? 我正在用C / C ++编程,计划为Windows和Linux编写代码。 提前谢谢了。 编辑:所以在这里所有的网络编程向导的帮助下,我找到了我的问题的解决方案:) select()对我来说就是这个…… 非常感谢所有花时间帮助我的人

在C中进行UDP广播

当我通过下面的代码广播消息时,主机上的服务器也会收到消息,如何防止主机接收它发送的消息? 是否可以更改代码上的内容,或者更好地使用if (strcmp(hostIP == IP_of_the_package) == 0) { } ? 主机从DHCP获取IP,如何将hostIP as a variable定义hostIP as a variable如何提取IP addr of the packet ? void boardcast_msg(char *mess){ int sock; struct sockaddr_in broadcastAddr; char *broadcastIP; unsigned short broadcastPort; char *sendString; int broadcastPermission; int sendStringLen; broadcastIP = “255.255.255.255”; broadcastPort = 33333; sendString = mess; /* string to broadcast */ […]

来自未知来源的MPI异步广播

我有一个C项目,有n个处理器在进行一种树搜索。 在程序的任何给定时间,这些过程中的任何一个都可能找到感兴趣的东西并且想要异步地将其发送到所有其他处理器。 如何在其他进程中侦听新消息,而无需在每次循环迭代时循环遍历所有可能的发送方? 我已经阅读了有关此问题的其他问题,例如这个问题( MPI – 异步广播/收集 ),但是,到目前为止我所看到的所有问题都没有处理不可预测的发送者或循环每个可能的发送者,我实际上并不是这样。花哨。 编辑澄清: 将找到的值发送到根级别并从那里分发它是不可选的。 如果我没有那个条件,祖兰的答案会起作用,所以对于其他人来说,这可能会有所帮助。 在我的情况下,它可以(并且肯定会)发生不同的排名找到他们需要多次共享的东西(这意味着竞争条件也可能发生)。

如何忽略自己的广播udp数据包

对于以下我假设一张网卡。 我有一个程序的组件,旨在让子网中的其他人知道它的存在。 为此,我实现了一个解决方案,无论何时程序启动(以及之后定期)它都会向INADDR_BROADCAST发送广播 – 无论谁收听所需的端口,都会记住它来自哪里供以后使用。 这个问题是我不想记住我自己的广播。 我认为理论上这很容易做 – 只需找出本地ip并与recvfrom内容进行比较。 但是,我发现很难获得本地IP:带有NULL的getaddrinfo返回127.0.0.1 ,带有主机名的getaddrinfo返回公共IP。 任何人都可以指向我找到实际的子网IP的方向? 我想我必须错过一些非常明显的东西但是……我还是错过了:) 注意:我已经阅读了有关广播的其他SO问题,特别是这一个: 所有接口上的UDP-Broadcast,但我尚未解决多接口问题。

可以通过TCP进行广播吗?

我正在用C编写服务器/客户端系统,它在TCP连接下使用BSD套接字。 服务器是multithreading的,每个连接都在自己的接收器中运行。 每个客户端都能很好地与服务器进行一对一的交谈,遗憾的是我无法想到实现SendToAll()函数的方法,例如,如果客户端A做了需要发送数据包的事情。所有的客户。 我该怎么办? 我正在考虑在每个接收器中实现队列,并且任何广播都被发送到这些队列; 当接收器发出一个新数据包时,它会将该消息添加到数据包中,如果这有意义的话。 但是,有没有办法通过TCP广播,就像你可以通过UDP?