/* * Author: Leng_que * Date: 2009年11月14日 * E-mail: leng_que@yahoo.com.cn * Description: 发送端 —— UDP广播编程 * Change: v0.2 修改了之前版本中的一些不合理的地方。2010年8月15日 */ #pragma comment(lib, "Ws2_32.lib") #include <stdio.h> #include <Winsock2.h> WORD g_wBroadPort = 54321; //广播端口 int main(void) { char szBuf[] = "现在广播天气预报,明天多云转晴!"; WSADATA wsa; if ( 0 != WSAStartup(MAKEWORD(2,2), &wsa) ) return -1; SOCKET skt = INVALID_SOCKET; skt = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if ( INVALID_SOCKET == skt ) return -1; //设置socket选项,使其能够发送广播数据包。 bool optval = true; if ( SOCKET_ERROR == setsockopt(skt, SOL_SOCKET, SO_BROADCAST, (const char*)&optval, sizeof(optval)) ) { return -1; } //广播地址 struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(g_wBroadPort); addr.sin_addr.S_un.S_addr = INADDR_BROADCAST; printf("正在向局域网广播数据包……/r/n"); int iRet = 0; while (true) { //发送广播数据包 if ( SOCKET_ERROR == sendto(skt, szBuf, sizeof(szBuf), 0, (const struct sockaddr*)&addr, sizeof(addr)) ) { iRet = -1; break; } printf("."); Sleep(1000); } closesocket(skt); skt = INVALID_SOCKET; WSACleanup(); return iRet; } /* * Author: Leng_que * Date: 2009年11月14日 * E-mail: leng_que@yahoo.com.cn * Description: 接收端 —— UDP广播编程 * Change: v0.2 修改了之前版本中的一些不合理的地方。2010年8月15日 */ #pragma comment(lib,"ws2_32.lib") #include <stdio.h> #include <Winsock2.h> WORD g_wBroadPort = 54321; //广播端口 int main(void) { char szBuf[1024]; struct sockaddr_in senderAddr; //用于存放发送广播数据包的主机的地址 WSADATA wsa; if ( 0 != WSAStartup(MAKEWORD(2,2), &wsa) ) return -1; SOCKET skt = INVALID_SOCKET; skt = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if ( INVALID_SOCKET == skt ) return -1; //本机(即:接收端)地址 struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(g_wBroadPort); addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.101"); //填入本机IP地址 //绑定socket if ( SOCKET_ERROR == bind(skt, (const sockaddr *)&addr, sizeof(addr)) ) { return -1; } int iLen = sizeof(senderAddr); int iReadNum = 0; printf("正在等待接收数据……/r/n"); int iRet = 0; while (true) { //接收广播数据包 iReadNum = recvfrom(skt, szBuf, sizeof(szBuf), 0, (struct sockaddr*)&senderAddr, &iLen); if ( SOCKET_ERROR == iReadNum ) { iRet = -1; break; } else { static int iCount = 0; memset(szBuf+iReadNum, '/0', 1); printf("[%02d] 接收到主机[%s]发来的广播数据[%d]Byte/r/n内容为:[%s]/r/n/r/n", iCount++, inet_ntoa(senderAddr.sin_addr), iReadNum,szBuf); } } closesocket(skt); skt = INVALID_SOCKET; WSACleanup(); return iRet; }