【发布时间】:2014-06-05 22:45:17
【问题描述】:
我想问一下是否有可能,以及我如何从我的 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 以便我可以将一些消息发送回 服务器
【问题讨论】: