【问题标题】:Sending broadcast server -> client and sending back client -> server UDP C Socket发送广播服务器 -> 客户端并发送回客户端 -> 服务器 UDP C Socket
【发布时间】: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 以便我可以将一些消息发送回 服务器

【问题讨论】:

    标签: c udp broadcast


    【解决方案1】:

    客户端应该以某种方式接收该消息,并且以这种方式获取服务器地址,以便他们可以将一些消息发送回服务器。

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

    【讨论】:

      【解决方案2】:

      服务器和客户端的错误都在

          addr.sin_port = htons("2000");
      

      htons() 接受一个整数,而不是一个字符串。写

          addr.sin_port = htons(2000);
      

      改为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 2014-06-20
        相关资源
        最近更新 更多