Sunmoon_BIT/Win32API

WSAAsyncSelect 예제

와앙노 2010. 2. 22. 09:18


 

"ASYNSELECT_SERVER.h"
#pragma comment (lib,"ws2_32")
#include <winsock2.h>

#include "resource.h"
#include <stdio.h>
#include <windows.h>

#define MWM_SOCK (WM_APP +1)
#define C_IP "192.168.34.110"
#define MY_IP "192.168.34.110"
#define USE_PORT 1444

BOOL CALLBACK DlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);
BOOL DlgCmd(HWND hDlg,WPARAM wParam);
BOOL InitSock(HWND hDlg);
BOOL Onsock(HWND hDlg,SOCKET sock,WORD msg,WORD eid);
void AcceptProc(HWND hDlg,SOCKET sock);
void ReadMSG(HWND hDlg,SOCKET sock);


"ASYNSELECT_SERVER.cpp"
#include "ASYNSELECT_SERVER.h"
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
 WSADATA wsadata;
 if(WSAStartup(MAKEWORD(2,2),&wsadata) != 0)
 {
  return 0;
 }
 HANDLE hMutex = CreateMutex(NULL,FALSE,"ASYNC_SERVER");
 if(GetLastError() != ERROR_ALREADY_EXISTS)
 {
  DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,DlgProc);
  CloseHandle(hMutex);
  WSACleanup();
  return 0;
 }
 MessageBox(NULL,"이미 실행 중 입니다","경고",MB_OK);
 CloseHandle(hMutex);
 WSACleanup();
 return 0;
}
BOOL CALLBACK DlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 switch(iMessage)
 {
 case WM_INITDIALOG :  return InitSock(hDlg);
 case WM_COMMAND  :  return DlgCmd(hDlg,wParam);
 case MWM_SOCK  :  return Onsock(hDlg,(SOCKET)wParam,LOWORD(lParam),HIWORD(lParam)); 
 }
 return FALSE;
}
BOOL DlgCmd(HWND hDlg,WPARAM wParam)
{
 switch(LOWORD(wParam))
 {
 case IDCANCEL : EndDialog(hDlg,IDD_DIALOG1);
 }
 return TRUE;
}
BOOL InitSock(HWND hDlg)
{
 SOCKET sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
 SOCKADDR_IN servaddr = {0,};
 servaddr.sin_addr.s_addr = inet_addr(MY_IP);
 servaddr.sin_port = htons(USE_PORT);
 servaddr.sin_family = PF_INET;
 
 bind(sock,(SOCKADDR *)&servaddr,sizeof(servaddr));
 listen(sock,3);
 WSAAsyncSelect(sock,hDlg,MWM_SOCK,FD_ACCEPT);
 return TRUE;
}
BOOL Onsock(HWND hDlg,SOCKET sock,WORD msg,WORD eid)
{
 switch(msg)
 {
 case FD_ACCEPT : AcceptProc(hDlg,sock); break;
 case FD_READ : ReadMSG(hDlg,sock);  break;
 }
 return TRUE;
}
void AcceptProc(HWND hDlg,SOCKET sock)
{
 SOCKADDR_IN clientaddr = {0,};
 int len = sizeof(clientaddr);
 SOCKET dosock = accept(sock,(SOCKADDR *)&clientaddr,&len);
 WSAAsyncSelect(dosock,hDlg,MWM_SOCK,FD_READ);
}
void ReadMSG(HWND hDlg,SOCKET sock)
{
 int MSGlen;
 char msg[256];
 memset(msg,0,256);
 recv(sock,(char*)&MSGlen,sizeof(MSGlen),0);
 recv(sock,msg,MSGlen,0);
 //MessageBox(hDlg,"메세지가 도착하였습니다","OK",MB_OK);
 SendMessage(GetDlgItem(hDlg,IDC_LIST1),LB_ADDSTRING,0,(LPARAM)msg);//list에 추가!
}



 

"ASYNCSELECT_CLIENT.h"
#pragma comment (lib,"ws2_32")
#include <winsock2.h>
#include "resource.h"
#include <stdio.h>
#include <windows.h>

#define MWM_SOCK (WM_APP +1)
#define C_IP "192.168.34.110"
#define MY_IP "192.168.34.110"
#define USE_PORT 1444
BOOL CALLBACK DlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);
BOOL InitSock(HWND hDlg);
BOOL DlgCmd(HWND hDlg,WPARAM wParam);
BOOL OnSock(HWND hDlg,SOCKET sock,WORD msg,WORD eid);
void SendMSG(HWND hDlg);
void WriteProc(HWND hDlg,SOCKET sock);
void ConnectProc(HWND hDlg,SOCKET sock);

"ASYNCSELECT_CLIENT.cpp"
#include "ASYNCSELECT_CLIENT.h"
INT APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstacne,LPSTR lpCmdLine,int nShowCmd)
{
 WSADATA wsadata;
 if(WSAStartup(MAKEWORD(2,2),&wsadata) != 0)
 {
  return 0;
 }
 HANDLE hMutex = CreateMutex(NULL,FALSE,"C_MUTEX");
 if(GetLastError() != ERROR_ALREADY_EXISTS)
 {
  DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,DlgProc);
  CloseHandle(hMutex);
  WSACleanup();
  return 0;
 }
 MessageBox(NULL,"이미 실행 중 입니다","ERROR",MB_OK);
 CloseHandle(hMutex);
 WSACleanup();
 return 0;
}
BOOL CALLBACK DlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 switch(iMessage)
 {
 case WM_INITDIALOG :  return InitSock(hDlg);
 case WM_COMMAND  :  return DlgCmd(hDlg,wParam);;
 case MWM_SOCK  :  return OnSock(hDlg,(SOCKET)wParam,LOWORD(lParam),HIWORD(lParam)); 
 }
 return FALSE;
}
BOOL InitSock(HWND hDlg)
{
 
 
 return TRUE;
}
BOOL DlgCmd(HWND hDlg,WPARAM wParam)
{
 switch(LOWORD(wParam))
 {
 case IDCANCEL : EndDialog(hDlg,IDD_DIALOG1); break;
 case IDOK  : SendMSG(hDlg);     break;
 }
 return TRUE;
 
}
BOOL OnSock(HWND hDlg,SOCKET sock,WORD msg,WORD eid)
{
 switch(msg)
 {
 case FD_CONNECT : ConnectProc(hDlg,sock); break;
 case FD_WRITE : WriteProc(hDlg,sock); break;
 }
 return TRUE;
}
void SendMSG(HWND hDlg)

 SOCKET sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
 SOCKADDR_IN clientaddr = {0,};
 clientaddr.sin_addr.s_addr=inet_addr(MY_IP);
 clientaddr.sin_port = htons(USE_PORT);
 clientaddr.sin_family = PF_INET;
 WSAAsyncSelect(sock,hDlg,MWM_SOCK,FD_CONNECT);
 connect(sock,(SOCKADDR*)&clientaddr,sizeof(clientaddr));
}
void ConnectProc(HWND hDlg,SOCKET sock)
{
 WSAAsyncSelect(sock,hDlg,MWM_SOCK,FD_WRITE);
}
void WriteProc(HWND hDlg,SOCKET sock)
{
 char Message[256+1];
 GetDlgItemText(hDlg,IDC_EDIT1,Message,sizeof(Message));
 int MSGlen = strlen(Message);
 send(sock,(char*)&MSGlen,sizeof(int),0);
 send(sock,Message,MSGlen,0);
 SetDlgItemText(hDlg,IDC_EDIT1,"");
}