c - 不知道如何在子网 UDP 套接字 c 中获取服务器地址

标签 c network-programming udp broadcast

我有一个问题:

有什么办法,如果有的话,我可以从客户端的角度通过广播发现服务器地址吗?

我几乎阅读了 Internet 上的所有内容,但没有关于如何在不知道其名称 (gethostbyname()) 的情况下发现服务器地址的信息。我需要使用 UDP 创建一个客户端-服务器应用程序,其中服务器发送广播,客户端应该发现它并将一些文本发回给它。

据我所知,客户端需要创建一个套接字,然后通过 gethostbyname() 获取主机(服务器)地址,以便拥有一个可以在其上执行 recvfrom() 然后执行即 sendto() 的地址。

基本上,服务器仅以端口(命令行参数)启动,在该端口上创建其套接字和 bind(),客户端也仅以端口(命令行参数)启动,并且应该通过广播发现服务器地址。这是我目前所拥有的:

服务器:

   struct sockaddr_in addr;
    int socketfd,t=1;
    socketfd = make_socket(PF_INET,type);
    memset(&addr, 0, sizeof(struct sockaddr_in));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR,&t, sizeof(t))) ERR("setsockopt");
    if(bind(socketfd,(struct sockaddr*) &addr,sizeof(addr)) < 0)  ERR("bind");

然后我想从服务器将它广播到子网中的任何地方,但不知道为什么:(

客户:

struct sockaddr_in addr;
    struct hostent *hostinfo;
    addr.sin_family = AF_INET;
    addr.sin_port = htons (port);
    hostinfo = gethostbyname(address);
    if(hostinfo == NULL)HERR("gethostbyname");
    addr.sin_addr = *(struct in_addr*) hostinfo->h_addr;

在这里我想以某种方式接收服务器广播的内容并发回一些文本。

编辑: 我会这样做:

int fd;
struct sockaddr_in addr;

fd = socket(PF_INET, SOCK_DGRAM, 0);

char buf[TEXT_SIZE];
socklen_t size=sizeof(addr);

recvfrom(fd, (char *)buf, sizeof(char[FILE_SIZE]), 0, &addr, &size);

但是我如何设置服务器来广播它,以便上面代码中的客户端可以接收到它?我总是通过以下方式发送:

sendto(fd, (char *)some_buffer, sizeof(some_buffer), 0, &addr, sizeof(addr));

但是我的服务器无法发现客户端addr,因为它必须首先向所有客户端发送广播。所以我不能在这里填写addr,因为它还没有设置。服务器有没有办法在不知道客户端地址的情况下首先广播消息?服务器只创建一个绑定(bind)它的套接字,然后需要立即广播一些文本。感谢您的回复。

最佳答案

您在解决问题的方式上存在混淆。

gethostbyname 将使用解析器根据提供的名称查找 IP 地址。因此,您需要提供服务器名称并在某处进行映射:它可以是主机文件中的相应条目或 DNS 服务器中的 A(或 AAAA)记录。

但是从你的问题描述来看,你似乎不想使用gethostbyname来获取服务器IP地址。

如果服务器正在广播 UDP 数据报并且您的客户端知道它广播到的端口,则客户端可以读取 UDP 数据报并获取源地址。

顺便说一句,您显示的服务器代码没有发送广播。

这看起来像是网络类(class)的练习。

关于c - 不知道如何在子网 UDP 套接字 c 中获取服务器地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24044511/

相关文章:

c - ARM:通过 UART 读取 modbus 数据失败

c - 递归函数,它将返回给定数字的二进制数

c - 遍历数组元素会在数组计数器的最后一个值上产生奇怪的值

ios - "sudo sysctl net.inet.ip.fw.enable=1"不适用于 macOS Sierra

sql-server - 通过 JDBC 连接到不同域上的 SQL Server

network-programming - 如何确保 UDP 服务器不会丢失传入数据?

c - 将语句表达式标记为可能未使用

c++ - 检查私有(private)IP地址是否被使用

udp - 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

Java UDP服务器