以下是Windows平台下基于Winsock的UDP组播接收的示例代码:
#include <stdio.h> #include <stdlib.h> #include <winsock2.h> #define MULTICAST_IP "224.0.0.1" // <em>组播</em>IP地址 #define LOCAL_IP "192.168.1.100" // 本地IP地址 #define PORT 8888 // <em>端</em>口号 #define MAX_BUF_LEN 1024 // 缓冲区大小 int main() { // 初始化Winsock WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed with error code %d ", WSAGetLastError()); return 1; } // 创建套接字 <em>SOCKET</em> sock = <em>socket</em>(AF_INET, SOCK_DGRAM, IPPROTO_<em>UDP</em>); if (sock == INVALID_<em>SOCKET</em>) { printf("<em>socket</em> failed with error code %d ", WSAGetLastError()); WSACleanup(); return 1; } // 绑定本地IP地址和<em>端</em>口号 struct sockaddr_in localAddr; localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = inet_addr(LOCAL_IP); localAddr.sin_port = htons(PORT); if (bind(sock, (struct sockaddr*)&localAddr, sizeof(localAddr)) == <em>SOCKET</em>_ERROR) { printf("bind failed with error code %d ", WSAGetLastError()); close<em>socket</em>(sock); WSACleanup(); return 1; } // 加入<em>组播</em>组 struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP); mreq.imr_interface.s_addr = inet_addr(LOCAL_IP); if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) == <em>SOCKET</em>_ERROR) { printf("setsockopt failed with error code %d ", WSAGetLastError()); close<em>socket</em>(sock); WSACleanup(); return 1; } // 接收数据 char buf[MAX_BUF_LEN]; struct sockaddr_in fromAddr; int fromLen = sizeof(fromAddr); int recvLen; while (1) { recvLen = recvfrom(sock, buf, MAX_BUF_LEN, 0, (struct sockaddr*)&fromAddr, &fromLen); if (recvLen > 0) { buf[recvLen] = '0'; printf("Received message from %s: %s ", inet_ntoa(fromAddr.sin_addr), buf); } } // 退出<em>组播</em>组 if (setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) == <em>SOCKET</em>_ERROR) { printf("setsockopt failed with error code %d ", WSAGetLastError()); close<em>socket</em>(sock); WSACleanup(); return 1; } // 关闭套接字 close<em>socket</em>(sock); // 清理Winsock WSACleanup(); return 0; }
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/138077.html