发送广播服务器->客户并发回客户->服务器UDP C套接字 [英] Sending broadcast server -> client and sending back client -> server UDP C Socket

查看:106
本文介绍了发送广播服务器->客户并发回客户->服务器UDP C套接字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想问是否有可能,以及如何从UDP服务器向客户端发送广播,然后将响应从客户端发送回服务器。

I want to ask if there is a possibility and if there is how do I send broadcast from my UDP server to client and after that send back response from client to server.

我需要实现一个应用程序,其中服务器在子网中发送广播,客户端应该以某种方式接收该消息,并以此方式获取服务器地址,以便他们可以将一些消息发送回服务器。

I need to implement an application where server sends broadcast on a subnetwork and clients are supposed to receive that message somehow and in that way would get server address so that they could send some messages back to server.

我创建了一个带有指定服务器端口(例如2000)的套接字,并设置了 setsockopt 发送到 SO_BROADCAST 并发送了带有 sendto 的消息,但是我的客户端挂在 recvfrom 永远。好像它没有从服务器的广播中收到任何东西。如何解决这个问题?

I created a socket with specified server port say 2000 and set setsockopt to SO_BROADCAST and sent some message with sendto but my client hangs on recvfrom forever. Seems like it does not receive anything from server's broadcasting. How to fix this?

服务器:

    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);

我的客户挂在此Recvfrom上了,因此我无法保存 serv_addr 以便我可以将一些消息发送回服务器

And my client hangs on this recvfrom... and therefore I cannot get serv_addr to be stored so that I could send some message back to the server

推荐答案

服务器和客户端中的错误均在

The error in both server and client is in

    addr.sin_port = htons("2000");

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

htons() takes an integer, not a string. Write

    addr.sin_port = htons(2000);

相反。

这篇关于发送广播服务器-&gt;客户并发回客户-&gt;服务器UDP C套接字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆