用C广播

时间:2012-04-25 19:53:56

标签: c network-programming udp broadcast

我有一个用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秒发送一条广播消息,我必须用系统时间回答该广播消息。 到目前为止,这是我提出的想法,当然我没有回答那个广播信息,因为我甚至无法阅读它。

2 个答案:

答案 0 :(得分:1)

我刚刚解决了这个问题。代码工作得很好,我只需要禁用防火墙。但我不确切知道这对我有什么帮助。无论如何,感谢您的回答和评论。

答案 1 :(得分:0)

也许,你必须使套接字无阻塞? 尝试:

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