Windows C++ 廣播demo

 

廣播端:

// broadcast.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#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;
}


 

接收“廣播”端

// wait_broadcast.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章