gpt4 book ai didi

c - 发送广播服务器 -> 客户端并发回客户端 -> 服务器 UDP C Socket

转载 作者:太空宇宙 更新时间:2023-11-04 08:40:04 26 4
gpt4 key购买 nike

我想问一下是否有可能,如果有的话,我该如何将广播从我的 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)) <= 0)
{
perror("something went wrong..");

return EXIT_FAILURE;
}

客户:

    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");

char data[12];
struct sockaddr_in serv_addr;
socklen_t size=sizeof(serv_addr);

recvfrom(fd, (char *)data, sizeof(char[12]), 0, &serv_addr, &size);

我的 client 卡在这个 recvfrom... 上,因此我无法存储 serv_addr 以便我可以将一些消息发送回 服务器

最佳答案

Clients are supposed to receive that message somehow and in that way would get server address so that they could send some messages back to server.

我认为这里有一个问题:客户端要接收到服务器广播的消息,首先要知道服务器的地址。套接字可以从未知地址接收数据/通信的唯一时间是在已设置端口转发的端口上使用 listen() 的服务器(由路由器提供)。因此,除非客户端已经有了服务器地址,否则客户端接收数据似乎是不可能的,因此卡在 recvfrom() 上。

关于c - 发送广播服务器 -> 客户端并发回客户端 -> 服务器 UDP C Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071415/

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