User Datagram Protocol
Client.cpp
Sender.cpp
Sender.cpp
<UDP 소켓 함수>
|
UDP echo Server
Server.cpp
#include <iostream>
#include <winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.LIB")
#define BUF_LEN 256
void printError(TCHAR *errMsg)
{
TCHAR* lpOSMsg;
int errNum = WSAGetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpOSMsg,
0,
NULL);
wcout << TEXT("[ERROR] ") << errMsg << TEXT(", [") << errNum << TEXT("] ") << lpOSMsg << endl;
LocalFree(lpOSMsg);
}
int main(void)
{
setlocale(LC_ALL, "");
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR)
{
printError(TEXT("윈도우 소켓 초기화 에러"));
return -1;
}
wcout << TEXT("server WinSock 초기화 : ver ") << (int)LOBYTE(wsaData.wVersion) << "." << (int)HIBYTE(wsaData.wVersion) << endl;
SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); //socket
try
{
if (sock == INVALID_SOCKET)
throw TEXT("대기 소켓 객체 생성 실패");
struct sockaddr_in addr;
addr.sin_family = AF_INET; //TCP, UDP..
addr.sin_port = htons(1024);
addr.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr("127.0.0.1");
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) throw TEXT("bind error");
while(true)
{
struct sockaddr_in cliaddr;
int addrlen = sizeof(cliaddr);
TCHAR buf[BUF_LEN] = {0};
if (recvfrom(sock, (char*)buf, BUF_LEN * sizeof(TCHAR), 0, (struct sockaddr*) &cliaddr, &addrlen) == SOCKET_ERROR)
{
wcout << TEXT("recvfrom error") << endl;
continue;
}
wcout << TEXT("echo msg : (") << inet_ntoa(cliaddr.sin_addr) << TEXT(":") << ntohs(cliaddr.sin_port) << TEXT(") :") << buf<< endl;
sendto (sock, (char*)buf, lstrlen(buf) * sizeof(TCHAR), 0, (struct sockaddr*) &cliaddr, sizeof(cliaddr));
if (lstrcmp(buf, TEXT("quit")) == 0) break;
}
}
catch (TCHAR* errMsg)
printError(errMsg);
if (sock != INVALID_SOCKET)
{
struct linger ling;
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char*)&ling, sizeof(ling));
closesocket(sock);
}
WSACleanup();
return 0;
}
|
Client.cpp
#include <iostream>
#include <winsock2.h>
#include <tchar.h>
#include <istream>
using namespace std;
#pragma comment(lib, "ws2_32.LIB")
#define BUF_LEN 256
void printError(TCHAR *errMsg)
{
TCHAR* lpOSMsg;
int errNum = WSAGetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpOSMsg,
0,
NULL);
wcout << TEXT("[ERROR] ") << errMsg << TEXT(", [") << errNum << TEXT("] ") << lpOSMsg << endl;
LocalFree(lpOSMsg);
}
int main(void)
{
setlocale(LC_ALL, "");
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR)
{
printError(TEXT("윈도우 소켓 초기화 에러"));
return -1;
}
wcout << TEXT("client WinSock 초기화 : ver ") << (int)LOBYTE(wsaData.wVersion) << "." << (int)HIBYTE(wsaData.wVersion) << endl;
SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); //socket
try
{
if (sock == INVALID_SOCKET) throw TEXT("대기 소켓 객체 생성 실패");
struct sockaddr_in addr;
addr.sin_family = AF_INET; //TCP, UDP..
addr.sin_port = htons(1024);
addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //htonl(INADDR_ANY); //inet_addr("127.0.0.1");
while(true)
{
TCHAR buf[BUF_LEN] = {0};
wcout << TEXT("보낼 msg : ");
wcin.getline(buf, BUF_LEN);
if (sendto (sock, (char*)buf, lstrlen(buf)*sizeof(TCHAR), 0, (struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR)
{
wcout << "sendto error" << endl;
continue;
}
ZeroMemory(buf, sizeof(buf));
struct sockaddr_in addr2 = {0};
int addrlen = sizeof(addr2);
if (recvfrom(sock, (char*)buf, BUF_LEN*sizeof(TCHAR), 0, (struct sockaddr*) &addr2, &addrlen) == SOCKET_ERROR)
{
wcout << "recvfrom error" << endl;
continue;
}
wcout << TEXT("받은 msg : ") << buf << endl;
if (lstrcmp(buf, TEXT("quit")) == 0) break;
}
}
catch (TCHAR* errMsg)
printError(errMsg);
if (sock != INVALID_SOCKET)
closesocket(sock);
WSACleanup();
return 0;
}
|
UDP BROADCAST
Receiver.cpp
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
#pragma comment(lib, "ws2_32.LIB")
#define BUF_LEN 256
void printError(TCHAR *errMsg)
{
TCHAR* lpOSMsg;
int errNum = WSAGetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpOSMsg,
0,
NULL);
wcout << TEXT("[ERROR] ") << errMsg << TEXT(", [") << errNum << TEXT("] ") << lpOSMsg << endl;
LocalFree(lpOSMsg);
}
int main(void)
{
setlocale(LC_ALL, "");
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR)
{
printError(TEXT("윈도우 소켓 초기화 에러"));
return -1;
}
wcout << TEXT("server WinSock 초기화 : ver ") << (int)LOBYTE(wsaData.wVersion) << "." << (int)HIBYTE(wsaData.wVersion) << endl;
SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); //socket
try
{
if (sock == INVALID_SOCKET) throw TEXT("대기 소켓 객체 생성 실패");
struct sockaddr_in addr;
addr.sin_family = AF_INET; //TCP, UDP..
addr.sin_port = htons(1024);
addr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl(INADDR_ANY); //inet_addr("127.0.0.1");
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) throw TEXT("bind error");
while(true)
{
struct sockaddr_in cliaddr;
int addrlen = sizeof(cliaddr);
TCHAR buf[BUF_LEN] = {0};
if (recvfrom(sock, (char*)buf, BUF_LEN * sizeof(TCHAR), 0, (struct sockaddr*) &cliaddr, &addrlen) == SOCKET_ERROR)
{
wcout << TEXT("recvfrom error") << endl;
continue;
}
wcout << TEXT("echo msg : (") << inet_ntoa(cliaddr.sin_addr) << TEXT(":") << ntohs(cliaddr.sin_port) << TEXT(") :") << buf<< endl;
if (lstrcmp(buf, TEXT("quit")) == 0) break;
}
//멀티 캐스트 그룹 탈퇴
if (setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) == SOCKET_ERROR)
throw TEXT("setsockopt error");
}
catch (TCHAR* errMsg)
printError(errMsg);
if (sock != INVALID_SOCKET)
{
struct linger ling;
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char*)&ling, sizeof(ling));
closesocket(sock);
}
WSACleanup();
return 0;
}
|
Sender.cpp
#include <iostream>
#include <winsock2.h>
#include <tchar.h>
#include <istream>
using namespace std;
#pragma comment(lib, "ws2_32.LIB")
#define BUF_LEN 256
void printError(TCHAR *errMsg)
{
TCHAR* lpOSMsg;
int errNum = WSAGetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpOSMsg,
0,
NULL);
wcout << TEXT("[ERROR] ") << errMsg << TEXT(", [") << errNum << TEXT("] ") << lpOSMsg << endl;
LocalFree(lpOSMsg);
}
int main(void)
{
setlocale(LC_ALL, "");
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR)
{
printError(TEXT("윈도우 소켓 초기화 에러"));
return -1;
}
wcout << TEXT("client WinSock 초기화 : ver ") << (int)LOBYTE(wsaData.wVersion) << "." << (int)HIBYTE(wsaData.wVersion) << endl;
SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); //socket
try
{
if (sock == INVALID_SOCKET) throw TEXT("대기 소켓 객체 생성 실패");
struct sockaddr_in addr;
addr.sin_family = AF_INET; //TCP, UDP..
addr.sin_port = htons(1024);
addr.sin_addr.s_addr = inet_addr("255.255.255.255"); //htonl(INADDR_ANY); //inet_addr("127.0.0.1");
//broadcast START
int so_broadcast = TRUE;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (const char*)&so_broadcast, sizeof(so_broadcast)) == SOCKET_ERROR) throw TEXT("setsockopt error");
while(true)
{
TCHAR buf[BUF_LEN] = {0};
wcout << TEXT("보낼 msg : ");
wcin.getline(buf, BUF_LEN);
if (sendto (sock, (char*)buf, lstrlen(buf)*sizeof(TCHAR), 0, (struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR)
{
wcout << "sendto error" << endl;
continue;
}
ZeroMemory(buf, sizeof(buf));
if (lstrcmp(buf, TEXT("quit")) == 0) break;
}
}
catch (TCHAR* errMsg)
printError(errMsg);
if (sock != INVALID_SOCKET)
closesocket(sock);
WSACleanup();
return 0;
}
|
UDP MULTICAST
Receiver.cpp
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
#pragma comment(lib, "ws2_32.LIB")
#define BUF_LEN 256
void printError(TCHAR *errMsg)
{
TCHAR* lpOSMsg;
int errNum = WSAGetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpOSMsg,
0,
NULL);
wcout << TEXT("[ERROR] ") << errMsg << TEXT(", [") << errNum << TEXT("] ") << lpOSMsg << endl;
LocalFree(lpOSMsg);
}
int main(void)
{
setlocale(LC_ALL, "");
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR)
{
printError(TEXT("윈도우 소켓 초기화 에러"));
return -1;
}
wcout << TEXT("server WinSock 초기화 : ver ") << (int)LOBYTE(wsaData.wVersion) << "." << (int)HIBYTE(wsaData.wVersion) << endl;
SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); //socket
try
{
if (sock == INVALID_SOCKET) throw TEXT("대기 소켓 객체 생성 실패");
struct sockaddr_in addr;
addr.sin_family = AF_INET; //TCP, UDP..
addr.sin_port = htons(1024);
addr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl(INADDR_ANY); //inet_addr("127.0.0.1");
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) throw TEXT("bind error");
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.1");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
//멀티 캐스트 가입
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) == SOCKET_ERROR) throw TEXT("setsockopt error");
while(true)
{
struct sockaddr_in cliaddr;
int addrlen = sizeof(cliaddr);
TCHAR buf[BUF_LEN] = {0};
if (recvfrom(sock, (char*)buf, BUF_LEN * sizeof(TCHAR), 0, (struct sockaddr*) &cliaddr, &addrlen) == SOCKET_ERROR)
{
wcout << TEXT("recvfrom error") << endl;
continue;
}
wcout << TEXT("echo msg : (") << inet_ntoa(cliaddr.sin_addr) << TEXT(":") << ntohs(cliaddr.sin_port) << TEXT(") :") << buf<< endl;
if (lstrcmp(buf, TEXT("quit")) == 0) break;
}
//멀티 캐스트 탈퇴
if (setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) == SOCKET_ERROR) throw TEXT("setsockopt error");
}
catch (TCHAR* errMsg)
printError(errMsg);
if (sock != INVALID_SOCKET)
{
struct linger ling;
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char*)&ling, sizeof(ling));
closesocket(sock);
}
WSACleanup();
return 0;
}
|
Sender.cpp
#include <iostream>
#include <winsock2.h>
#include <tchar.h>
#include <istream>
using namespace std;
#pragma comment(lib, "ws2_32.LIB")
#define BUF_LEN 256
void printError(TCHAR *errMsg)
{
TCHAR* lpOSMsg;
int errNum = WSAGetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errNum,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpOSMsg,
0,
NULL);
wcout << TEXT("[ERROR] ") << errMsg << TEXT(", [") << errNum << TEXT("] ") << lpOSMsg << endl;
LocalFree(lpOSMsg);
}
int main(void)
{
setlocale(LC_ALL, "");
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR)
{
printError(TEXT("윈도우 소켓 초기화 에러"));
return -1;
}
wcout << TEXT("client WinSock 초기화 : ver ") << (int)LOBYTE(wsaData.wVersion) << "." << (int)HIBYTE(wsaData.wVersion) << endl;
SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); //socket
try
{
if (sock == INVALID_SOCKET) throw TEXT("대기 소켓 객체 생성 실패");
struct sockaddr_in addr;
addr.sin_family = AF_INET; //TCP, UDP..
addr.sin_port = htons(1024);
addr.sin_addr.s_addr = inet_addr("224.0.0.1"); //htonl(INADDR_ANY); //inet_addr("127.0.0.1");
while(true)
{
TCHAR buf[BUF_LEN] = {0};
wcout << TEXT("보낼 msg : ");
wcin.getline(buf, BUF_LEN);
if (sendto (sock, (char*)buf, lstrlen(buf)*sizeof(TCHAR), 0, (struct sockaddr*) &addr, sizeof(addr)) == SOCKET_ERROR)
{
wcout << "sendto error" << endl;
continue;
}
ZeroMemory(buf, sizeof(buf));
if (lstrcmp(buf, TEXT("quit")) == 0) break;
}
}
catch (TCHAR* errMsg)
printError(errMsg);
if (sock != INVALID_SOCKET)
closesocket(sock);
WSACleanup();
return 0;
}
|
'C++' 카테고리의 다른 글
ODBC (open database connectivity) (1) | 2010.10.25 |
---|---|
현재 위치 __FILE__, __LINE__, __FUNCTION__ (0) | 2010.10.23 |
Database 연동 (0) | 2010.10.22 |
struct padding (구조체 패딩) 문제 (0) | 2010.10.21 |
TCP (Transmission Control Protocol) (2) | 2010.10.19 |
Overlapped Model (0) | 2010.10.19 |
IOCP model (0) | 2010.10.19 |
thread 함수를 클래스 멤버 함수로 지정하는 방법 (0) | 2010.10.19 |