728x90
반응형
SocketError.h
#pragma once
#include<WinSock2.h> //WSAAddressToString,WSAStringToAddress
#include <WS2tcpip.h> //inet_pton,inet_ntop,InetPton,InetNtop
#include<tchar.h>
#include<locale.h>
#include<stdio.h>
#define SERVER_IPPORT L"127.0.0.0:60000"
/*#ifdef UNICODE
#define ErrorExit wErrorExit
#define ErrorMsg wErrorMsg
#define OKMsg wOKMsg
#else
#define ErrorExit _ErrorExit
#define ErrorMsg _ErrorMsg
#define OKMsg _OKMsg
#endif*/
void ErrorExit(const TCHAR* str); //program exit
void ErrorMsg(const TCHAR* str); //monitor output
void OKMsg(const TCHAR* str);
//wsa socket error
/*void _ErrorExit(const char* str); //program exit
void _ErrorMsg(const char* str); //monitor output
void _OKMsg(const char* str);
void wErrorExit(const wchar_t* str); //program exit
void wErrorMsg(const wchar_t* str); //monitor output
void wOKMsg(const wchar_t* str);*/
//tcp server module
void InitTCPServer(SOCKET* serverSocket);
void DestroyTCPServer(SOCKET serverSocket);
void ClientAccept(SOCKET serverSocket, SOCKET* clientSocket);
void ClientClose(SOCKET clientSocket);
//tcp client module
void InitTCPClient(SOCKET* clientSocket);
void DestroyTCPClient(SOCKET clientSocket);
//library는 헤더의 제일마지막줄에 붙여야 한다.
#pragma comment(lib,"ws2_32.lib")
SocketError.h
#include "MySocketError.h"
void ErrorExit(const TCHAR* str)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_ALLOCATE_BUFFER
, NULL, WSAGetLastError()
, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)
, (TCHAR*)&lpMsgBuf, 0, NULL);
_tprintf(_T("[%s]%s\n"), str, (TCHAR*)lpMsgBuf);
LocalFree(lpMsgBuf);
exit(0);
}
void ErrorMsg(const TCHAR* str)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_ALLOCATE_BUFFER
, NULL, WSAGetLastError()
, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)
, (wchar_t*)&lpMsgBuf, 0, NULL);
_tprintf(_T("[%s]%s\n"), str, (TCHAR*)lpMsgBuf);
LocalFree(lpMsgBuf);
}
void OKMsg(const TCHAR* str)
{
_tprintf(_T("[%s]successfully~~~\n"), str);
}
void InitTCPServer(SOCKET* serverSocket)
{
int result = -1;
//WSAStartup
WSADATA wData = { 0 };
result = WSAStartup(MAKEWORD(2, 2), &wData);
if (result) ErrorExit(_T("WSAStartup"));
else OKMsg(_T("WSAStartup"));
//socket - 소켓만들어줌,서버소켓
//SOCKET serverSocket;
*serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (*serverSocket == INVALID_SOCKET) ErrorExit(_T("socket"));
else OKMsg(_T("socket"));
//bind - 소켓에 데이터를 저장하는데(Family,IP,PORT) 묶어준다는표현
SOCKADDR_IN serverAddress = { 0 };
//serverAddress.sin_family = AF_INET;
//serverAddress.sin_port = htons(SERVER_PORT);
//serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP);
wchar_t IPPort[30] = { 0 };
wcscpy_s(IPPort, 30, SERVER_IPPORT);
int sizeServerAddress = sizeof(serverAddress);
result = WSAStringToAddressW(IPPort, AF_INET, NULL,
(SOCKADDR*)&serverAddress, &sizeServerAddress);
if (result == SOCKET_ERROR) ErrorMsg(_T("WSAStringToAddressW"));
else OKMsg(_T("WSAStringToAddressW"));
result = bind(*serverSocket, (SOCKADDR*)&serverAddress, sizeof(serverAddress));
if (result == SOCKET_ERROR) ErrorMsg(_T("bind"));
else OKMsg(_T("bind"));
//listen - 알려주는겁니다.
result = listen(*serverSocket, 5);
if (result == SOCKET_ERROR) ErrorMsg(_T("listen"));
else OKMsg(_T("listen"));
}
void DestroyTCPServer(SOCKET serverSocket)
{
int result = -1;
result = closesocket(serverSocket);
if (result == SOCKET_ERROR) ErrorMsg(_T("closesocket-server"));
else OKMsg(_T("closesocket-server"));
//WSACleanup
result = WSACleanup();
if (result == SOCKET_ERROR) ErrorMsg(_T("WSACleanup"));
else OKMsg(_T("WSACleanup"));
}
void ClientAccept(SOCKET serverSocket, SOCKET* clientSocket)
{
int result = -1;
SOCKADDR_IN clientAddress = { 0 };
int sizeClientAddress = sizeof(clientAddress);
//SOCKET clientSocket;
*clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddress, &sizeClientAddress);
if (*clientSocket == INVALID_SOCKET) ErrorMsg(_T("accept"));
else OKMsg(_T("accept"));
wchar_t clientIPPort[30] = { 0 };
DWORD sizeClientIPPort = sizeof(clientIPPort);
result = WSAAddressToStringW((SOCKADDR*)&clientAddress,
sizeof(clientAddress), NULL, clientIPPort, &sizeClientIPPort);
if (result == SOCKET_ERROR) ErrorMsg(_T("WSAAddressToStringW"));
else OKMsg(_T("WSAAddressToStringW"));
wprintf(L"client(IP:%s,PORT:%d)accepted\n"
, clientIPPort
//, inet_ntoa(clientAddress.sin_addr)
, ntohs(clientAddress.sin_port));
}
void ClientClose(SOCKET clientSocket)
{
int result = -1;
result = closesocket(clientSocket);
if (result == SOCKET_ERROR) ErrorMsg(_T("closesocket-client"));
else OKMsg(_T("closesocket-client"));
}
void InitTCPClient(SOCKET* clientSocket)
{
int result = -1;
//WSAStartup
WSADATA wData = { 0 };
result = WSAStartup(MAKEWORD(2, 2), &wData);
if (!result) OKMsg(_T("WSAStartup"));
else ErrorExit(_T("WSAStartup"));
//socket
*clientSocket = socket(PF_INET, SOCK_STREAM, 0);
if (*clientSocket == INVALID_SOCKET) ErrorExit(_T("socket"));
else OKMsg(_T("socket"));
//connect
SOCKADDR_IN serverAddress = { 0 };
wchar_t IPPort[30] = { 0 };
wcscpy_s(IPPort, 30, SERVER_IPPORT);
int sizeServerAddress = sizeof(serverAddress);
result = WSAStringToAddressW(IPPort, AF_INET, NULL,
(SOCKADDR*)&serverAddress, &sizeServerAddress);
if (result == SOCKET_ERROR) ErrorMsg(_T("WSAStringToAddressW"));
else OKMsg(_T("WSAStringToAddressW"));
result = connect(*clientSocket, (SOCKADDR*)&serverAddress, sizeof(serverAddress));
if (result == SOCKET_ERROR) ErrorMsg(_T("connect"));
else OKMsg(_T("connect"));
}
void DestroyTCPClient(SOCKET clientSocket)
{
int result = closesocket(clientSocket);
if (result == SOCKET_ERROR) ErrorMsg(_T("closesocket"));
else OKMsg(_T("closesocket"));
//WSACleanup
result = WSACleanup();
if (result == SOCKET_ERROR) ErrorMsg(_T("WSACleanup"));
else OKMsg(_T("WSACleanup"));
}
1. main_1바이트 2바이트.cpp
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <tchar.h>
//int main(int argc,char *argv[])
//int wmain(int argc,wchar_t *argv[])
int _tmain(int argc, TCHAR* argv[])
{
//1.ascii 입니다.
/*char a = 'A';
char string[] = "Hello";
int count = strlen(string);
printf("count=%d개입니다.\n", count);
printf("메모리에는 %dbyte가 잡힙니다.\n", sizeof(string));
//2. unicode로 바꾸면
_wsetlocale(LC_ALL, L"korean");
wchar_t b = L'A';
wchar_t stringB[] = L"Hello";
int countB = wcslen(stringB);
wprintf(L"count=%d입니다\n", countB);
wprintf(L"메모리에는 %dbyte가 잡힙니다.\n", sizeof(stringB));*/
//3.TCHAR
_tsetlocale(LC_ALL, _T("korean"));
TCHAR b = _T('A');
TCHAR stringB[] = _T("Hello");
int countB = _tcslen(stringB);
_tprintf(_T("count=%d입니다\n"), countB);
_tprintf(_T("메모리에는 %dbyte가 잡힙니다.\n"), sizeof(stringB));
return 0;
}
2. tmain_함수를 만들어보자(strlen같은 함수를)
#include<stdio.h>
#include<string.h>
#ifdef UNICODE
#define _tMyStrlen wMyStrlen
#define _tMyStrcpy wMyStrcpy
#else
#define _tMyStrlen MyStrlen
#define _tMyStrcpy MyStrcpy
#endif
//컴파일할때 - 유니코드 변수 wchar_t, L'',L"",wprintf.....
// 멀티바이트 char, '',"", printf 로 바꿔줍니다.
/*#define MAX 100
#define BUFSIZE 10000
#ifdef UNICODE
#define TCHAR wchar_t
#define _tprintf wprintf
#define _tcslen wcslen
#define _tsetlocale _wsetlocale
#define _T(x) Lx
#else
#define TCHAR char
#define _tprintf printf
#define _tcslen strlen
#define _tsetlocale setlocale
#define _T(x) x
#endif*/
#include<tchar.h>
#include<locale.h>
int MyStrlen(const char* str);
int wMyStrlen(const wchar_t* str);
void MyStrcpy(char* dest, const char* source);
void wMyStrcpy(wchar_t* dest, const wchar_t* source);
int _tmain(void)
{
_tsetlocale(LC_ALL, _T("korean"));
int length = -1234;
length =_tMyStrlen(_T("ABCd한글"));
_tprintf(_T("%s 문자열은 %d개의 문자로 구성되어있습니다.\n")
, _T("ABCd한글"), length);
return 0;
}
int MyStrlen(const char* str)
{
int count = 0;
//while(*(str+count))
//while(*(str+count)!= 0)
//while(*(str+count)!= '\0')
while (*(str + count) != NULL)
count++;
return count;
}
int wMyStrlen(const wchar_t* str)
{
int count = 0;
//while(*(str+count))
//while(*(str+count)!= 0)
//while(*(str+count)!= '\0')
while (*(str + count) != NULL)
count++;
return count;
}
void MyStrcpy(char* dest, const char* source){}
void wMyStrcpy(wchar_t* dest, const wchar_t* source){}
728x90
반응형