我有一个问题:
有什么办法,如果有的话,我可以从客户端的角度通过广播发现服务器地址吗?
我几乎阅读了 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/