Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- .gitattributes
- git 대용량 파일
- Mqtt
- git 최초 설정
- ExtendWith
- Flutter
- LINK2001
- c++ set struct
- _sprintf
- esp-wroom-32d
- 멀티바이트 문자 집합 사용
- Plugins
- winsock.h Broadcast
- wxWidget
- __snprintf
- MFC
- OpenXLSX 한글
- OpenCPN설치
- sts4
- 사전설치
- OpenCPN
- c2678
- __vsnprintf
- c++ Broadcast
- SQLite3
- 설치 테스트
- Console
- 정적 라이브러리에서 MFC 사용
- 의존주입
- 확인할 수 없는 외부 기호
Archives
- Today
- Total
세상을 이롭게
BroadCast Example Source Code (winsock.h) C++ Window 본문
winsock.h을 이용한 Broadcast code는 잘 보이지 않아서 정리해 놓는다.
이 코드는 어디선가 돌아다니는 코드를 아주 살짝 수정했을 뿐이다.
Broadcast 방식은 프로토콜과 포트 번호만 일치시키면 동작한다. 아래의 포트번호를 수정하여 사용해보자.
Broadcast Send Code
#include <iostream>
#include <winsock.h>
#pragma comment( lib, "ws2_32.lib" )
using namespace std;
void main(void) {
WSAData wsaData;
SOCKET sock = NULL;
SOCKADDR_IN addrSender;
try {
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
throw WSAGetLastError();
}
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET) {
throw WSAGetLastError();
}
BOOL bEnable = TRUE;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bEnable, sizeof(bEnable)) == SOCKET_ERROR) {
throw WSAGetLastError();
}
memset((void*)&addrSender, 0, sizeof(SOCKADDR));
addrSender.sin_family = AF_INET;
//addrSender.sin_port = htons(9000);
addrSender.sin_port = htons(9901);
addrSender.sin_addr.s_addr = htonl(INADDR_BROADCAST);
char buf[1024] = { 0, };
while (1)
{
cin >> buf;
if (sendto(sock, buf, strlen(buf), 0, (SOCKADDR*)&addrSender, sizeof(SOCKADDR)) == SOCKET_ERROR) {
throw WSAGetLastError();
}
}
}
catch (int& ex) {
cout << "Error Code: " << ex << endl;
}
closesocket(sock);
WSACleanup();
}
Broadcast Recv Code
#include <iostream>
#include <winsock.h>
#pragma comment( lib, "ws2_32.lib" )
using namespace std;
void main(void) {
WSAData wsaData;
SOCKET sockReceiver = NULL;
SOCKADDR_IN addrReceiver;
try {
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
throw WSAGetLastError();
}
sockReceiver = socket(AF_INET, SOCK_DGRAM, 0);
if (sockReceiver == INVALID_SOCKET) {
throw WSAGetLastError();
}
BOOL bEnable = TRUE;
if (setsockopt(sockReceiver, SOL_SOCKET, SO_BROADCAST, (char*)&bEnable, sizeof(bEnable)) == SOCKET_ERROR) {
throw WSAGetLastError();
}
memset((void*)&addrReceiver, 0, sizeof(SOCKADDR));
addrReceiver.sin_family = AF_INET;
//addrReceiver.sin_port = htons(9000);
addrReceiver.sin_port = htons(9901);
addrReceiver.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockReceiver, (SOCKADDR*)&addrReceiver, sizeof(SOCKADDR)) == SOCKET_ERROR) {
throw WSAGetLastError();
}
SOCKADDR_IN senderAddr;
int addrLen = sizeof(SOCKADDR_IN);
char buf[1024] = { 0, };
while (1) {
if (recvfrom(sockReceiver, buf, strlen(buf), 0, (SOCKADDR*)&senderAddr, &addrLen) == SOCKET_ERROR) {
throw WSAGetLastError();
}
cout << buf << endl; memset(buf, 0, 1024);
}
}
catch (int& ex) {
cout << "Error Code: " << ex << endl;
}
closesocket(sockReceiver);
WSACleanup();
}
끝.
파일첨부
'C,C++' 카테고리의 다른 글
errer LINK2001: 확인할 수 없는 외부 기호 (0) | 2022.07.20 |
---|---|
string Unicode to multibyte/UTF-8 변환하기 (0) | 2022.07.01 |
c2678 이항'<':왼쪽 피연산자로 'const_Ty' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다. (0) | 2022.02.16 |
[C++] LNK2001, LNK1120 Class static 사용시 문제 (0) | 2022.02.10 |
VS MSB8008: 지정된 플랫폼 도구 집합(v142)이 설치되지 않았거나 올바르지 않습니다. (0) | 2021.11.29 |