【发布时间】:2014-06-04 18:05:04
【问题描述】:
我有一个问题:
有什么方法可以从客户端的角度通过广播发现服务器地址?
我几乎阅读了 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,因为它还没有设置。服务器有什么方法可以在不知道客户端地址的情况下首先广播消息?服务器只创建一个套接字绑定它,然后需要立即广播一些文本。感谢您的回复。
【问题讨论】:
-
使用 recvfrom 接收帧并获取发送者地址。
-
也许这会有所帮助> stackoverflow.com/questions/8017803/…
-
"我几乎阅读了互联网上的所有内容..." 哇! ;-)
-
您是否进行了建议的更改?
标签: c network-programming udp broadcast