【问题标题】:Broadcasting in CC中的广播
【发布时间】:2012-04-25 19:53:56
【问题描述】:

我有一个用 C 语言编写的应用程序,它同时是服务器和客户端。我要做的是:

sock = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&server, length);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(MYPORT);

char broadcast = '1';
int broadcastlen = sizeof(broadcast);
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, &broadcastlen) < 0) {
    close(sock);
    error("Error in setting broadcast option");
}
if (bind(sock, (struct sockaddr*) &server, sizeof(server)) < 0) {
    close(sock);
    error("Error in BINDING");
}
bzero(&sender, length);
bcast.sin_family = AF_INET;
bcast.sin_addr.s_addr = NBCAST; // NBCAST is the broadcast address of the subnet
bcast.sin_port = htons(MYPORT);

if (sendto(sock, dateQuery, strlen(dateQuery) + 1, 0, (struct sockaddr*)&bcast, sizeof(bcast)) < 0) {
    close(sock);
    error("ERROR in sending");
}

到目前为止,一切正常。但是我用 sock 参数启动一个线程来监听,并执行以下操作:

int len = sizeof(struct sockaddr_in);
struct sockaddr_in sender_addr;

recfrom(sock, recvbuff, recvbufflen, 0, (struct sockaddr*) &sender_addr, &len);

它会永远阻塞在那里。我试图让它在不同的 PC 上工作,但它似乎不起作用,因为线程由于 recvfrom() 而被阻塞。谁能告诉我我的代码有什么问题?

谢谢


编辑:如果我的代码坏了,你能建议解决这个问题的方法吗?所以,我的任务是用 C 语言实现一个同时作为服务器和客户端的应用程序。我每 3 秒发送一条广播消息,我必须用系统时间回复该广播消息。 到目前为止,这是我的想法,当然我没有回复那个广播消息,因为我什至看不懂它。

【问题讨论】:

  • 你能在调用recvfrom之前打印sock吗?
  • 我已经试过了,和主线程一样。我正确地传递了那个参数。
  • 你真的想要char broadcast = '1' 作为一个字符吗?我本来期望一个整数。您使用的是哪个平台?
  • 对了,如果你向局域网的广播地址发送一条消息,你作为消息的发送者会收到这条消息吗?
  • @bicska88:你面临两个风险:一个是你提到的作为发送者没有接收到广播(可能是网络堆栈的内核实现细节),另一个是@ 987654326@ 与 SOCK_DGRAM 结合可靠;因此无法保证传输成功。

标签: c network-programming udp broadcast


【解决方案1】:

我刚刚解决了这个问题。该代码运行良好,我只需要禁用防火墙。但我不知道这对我有什么帮助。无论如何,感谢您的答案和cmets。

【讨论】:

    【解决方案2】:

    也许,您必须使套接字非阻塞? 试试:

    u_long iMode = 1;
    ioctlsocket(sock, FIONBIO, &iMode);
    

    【讨论】:

    • 好的,但是如果它是非阻塞的呢?我仍然无法阅读该广播消息。我想阅读那条广播消息。
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多