接收广播消息端:
- #include "stdafx.h"
- #include <iostream>
- #include <WinSock2.h>
- #pragma comment(lib, "ws2_32.lib")
- const int MAX_BUF_LEN = 255;
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- WORD wVersionRequested;
- WSADATA wsaData;
- int err;
- wVersionRequested = MAKEWORD(2, 2);
- err = WSAStartup(wVersionRequested, &wsaData);
- if(err != 0)
- {
- return -1;
- }
- if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
- {
- WSACleanup();
- return -1;
- }
- SOCKET clientSock = socket(AF_INET, SOCK_DGRAM, 0);
- if (INVALID_SOCKET == clientSock)
- {
- err = WSAGetLastError();
- printf("socket error:%d\n", err);
- WSACleanup();
- return -1;
- }
- //创建本地地址信息并绑定
- SOCKADDR_IN sin;
- sin.sin_family = AF_INET;
- sin.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- sin.sin_port = htons(7001);
- if (bind(clientSock, (SOCKADDR*)&sin, sizeof(sin)) != 0)
- {
- err = WSAGetLastError();
- printf("bind error:%d\n", err);
- closesocket(clientSock);
- WSACleanup();
- return -1;
- }
- SOCKADDR_IN clientAddr;
- int addrLen = sizeof(clientAddr);
- int nSize;
- char recvBuff[1024];
- memset(recvBuff, 0, 1024);
- while(1){
- nSize = recvfrom(clientSock, recvBuff, 1024, 0, (SOCKADDR*)&clientAddr,&addrLen);
- if ( nSize == SOCKET_ERROR)
- {
- err = WSAGetLastError();
- printf("recv error:%d\n", err);
- break;
- }
- recvBuff[nSize] = '\0';
- printf("%s\n", recvBuff);
- }
- closesocket(clientSock);
- WSACleanup();
- return 0;
- }
发送广播消息端:
- #include "stdafx.h"
- #include <iostream>
- #include <stdio.h>
- #include <WinSock2.h>
- #pragma comment(lib, "ws2_32.lib")
- using namespace std;
- const int MAX_BUF_LEN = 255;
- int _tmain(int argc, _TCHAR* argv[])
- {
- WORD wVersionRequested;
- WSADATA wasData;//指向WinSocket信息结构的指针
- int err;
- wVersionRequested = MAKEWORD(2, 2);
- // 初始化winsock库,使用socket的前提
- err = WSAStartup(wVersionRequested, &wasData);
- if (err != 0)
- {
- return -1;
- }
- if (LOBYTE(wasData.wVersion) != 2 || HIBYTE(wasData.wVersion) != 2)
- {
- WSACleanup();
- return -1;
- }
- SOCKET conn_sock = socket(AF_INET, SOCK_DGRAM, 0);
- if (conn_sock == INVALID_SOCKET)
- {
- err = WSAGetLastError();
- printf("socket error:%d\n", err);
- closesocket(conn_sock);
- WSACleanup();
- return -1;
- }
- bool bOpt = true;
- //打开广播选项
- setsockopt(conn_sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
- // 设置发往的地址
- SOCKADDR_IN saUdpServ;
- memset(&saUdpServ, 0, sizeof(saUdpServ));
- saUdpServ.sin_family = AF_INET;
- saUdpServ.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);
- saUdpServ.sin_port = htons(7001);
- int nSize = sizeof(SOCKADDR_IN);
- char buff[MAX_BUF_LEN];
- memset(buff, 0, MAX_BUF_LEN);
- int nLoop = 0;
- char* ip = NULL;
- while(1){
- nLoop++;
- sprintf(buff, "Message %d", nLoop);
- int nSendSize = sendto(conn_sock, buff, strlen(buff), 0, (SOCKADDR*)&saUdpServ, nSize);
- if (nSendSize == SOCKET_ERROR)
- {
- err = WSAGetLastError();
- printf("sendto error:%d\n", err);
- closesocket(conn_sock);
- WSACleanup();
- return -1;
- }
- printf("send: %s\n", buff);
- Sleep(5000);
- }
- closesocket(conn_sock);
- WSACleanup();
- return 0;
- }