c - Windows 7 中的 UDP 广播 - 它有效吗?

标签 c network-programming udp

我正在尝试在 Windows 7 下编写一些代码以通过我的本地网络进行广播,但无法使以下代码正常工作。我来自 Linux 背景,所以对风格表示歉意 - 完整的代码可以编译等并且可以工作,如果我使用以下地址:

unsigned long broadcastAddr = inet_addr("192.168.10.0") | ~(inet_addr("255.255.240.0"));

那么效果很好,我真的很想使用首选的 INADDR_BROADCAST/255.255.255.255 方法。

<snip>
SOCKET sockfd;
int broadcast = 1;

WSADATA wsaData;    // Windows socket

// Initialize Winsock
if (WSAStartup(MAKEWORD(2,2), &wsaData) == SOCKET_ERROR) {
    perror("WinSock Error");
    getc(stdin);
    exit(EXIT_FAILURE);
}
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
    perror("Socket Error");
    getc(stdin);
        exit(1);
}

if ((setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast))) == SOCKET_ERROR) {
    perror("Setsockopt - SOL_SOCKET");
    getc(stdin);
    exit(1);
}

struct sockaddr_in recvaddr;
recvaddr.sin_family = AF_INET;
recvaddr.sin_port = htons(PORT);
recvaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
memset(recvaddr.sin_zero,'\0', sizeof(recvaddr.sin_zero));

int numbytes = 0;
while ((numbytes = sendto(sockfd, greet, strlen(greet) , MSG_DONTROUTE, (struct sockaddr *)&recvaddr, sizeof(struct sockaddr_in))) != -1) {
        printf("Sent a packet %d\n", numbytes);
        Sleep(100);
}

最佳答案

Windows 7 中存在一个 UDP 广播的巨大错误,这使得 255.255.255.255 上的广播在 大多数 Windows 7 安装上不起作用:https://serverfault.com/questions/72112/how-to-alter-the-global-broadcast-address-255-255-255-255-behavior-on-windows

基本上它只会在单个网络接口(interface)上发送广播,它可以是任何东西,甚至是 VM 网络接口(interface)或蓝牙接口(interface),最终可能不会广播到任何设备。

关于c - Windows 7 中的 UDP 广播 - 它有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4615275/

相关文章:

c - 套接字如何在 C 中工作?

在多线程程序中关闭文件描述符

c++ - switch 语句导致发送两条消息

ios - UDP 套接字不适用于 iOS 中的 3G 网络?

客户端服务器套接字编程

c - 优化后代码如何工作?

捕获从 C 中的另一个文件调用的函数的标准输出

java - 无阻塞读写java套接字

arrays - 动态数组的惯用初始化是否会调用未定义的行为?

c - 在不中断 C 中的输入提示的情况下在不同位置打印消息