글 수 83
#include <winsock2.h>
#include <windows.h>
#include "resource.h"
#include "ya.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
#define WM_CLIENTMSG (WM_USER + 1)
////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL StartWinsock() ;
BOOL CreateSocket(SOCKET *s) ;
void EndWinsock() ;
BOOL Select( HWND hwnd, SOCKET s, int Msg, int flag ) ;
BOOL Connect( char *pAddr, short port) ;
BOOL RecvMsg( SOCKET ClientSocket, char *recvbuff, HWND hwnd ) ;
BOOL SendMsg( SOCKET ClientSocket, char *sendbuff, int size) ;
////////////////////////////////////////////////////////////////////////////////////////////////////
SOCKET g_socket ;
char g_Buff[100] ;
char g_recvbuf[256] ;
int g_bufsize ;
////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK DlgProc(HWND hwnd, UINT iMsg, WPARAM wparam, LPARAM lparam) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
int ret ;
if(!StartWinsock())
{
AfxMessageBox("StartWinsock() Error") ;
return 0 ;
}
ret = DialogBox(hInstance, MAKEINTRESOURCE( IDD_DIALOG1 ), NULL, ( DLGPROC )DlgProc );
if(ret != 0)
{
AfxMessageBox("StartWinsock() Error") ;
EndWinsock() ;
return 0 ;
}
EndWinsock() ;
return 0 ;
}
BOOL CALLBACK DlgProc(HWND hwnd, UINT iMsg, WPARAM wparam, LPARAM lparam)
{
char IPAddress[50] = {0,} ;
HWND hListWnd ;
short port ;
switch(iMsg)
{
case WM_INITDIALOG :
CreateSocket(&g_socket) ;
Select(hwnd, g_socket, WM_CLIENTMSG, FD_CONNECT) ;
SetWindowText(hwnd, "client") ;
CenterWindow(hwnd) ;
return TRUE ;
case WM_COMMAND :
switch(LOWORD(wparam))
{
case IDC_CONNECT :
if(g_socket == INVALID_SOCKET)
{
CreateSocket(&g_socket) ;
Select(hwnd, g_socket, WM_CLIENTMSG, FD_CONNECT | FD_READ) ;
}
GetDlgItemText( hwnd, IDC_ADDRESS, IPAddress, sizeof(IPAddress) );
port = GetDlgItemInt(hwnd, IDC_PORT, NULL, TRUE) ;
if( Connect( IPAddress, port ) )
{
if( WSAEWOULDBLOCK == WSAGetLastError() )
{
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
SendLogMessage( hListWnd, "Server 접속이 대기중입니다..." );
}
else
{
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
SendLogMessage( hListWnd, "Server 접속이 성공적입니다..." );
}
}
else
{
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
SendLogMessage( hListWnd, "Server 접속에 실패 했습니다..." );
}
return TRUE ;
case IDC_DISCONNECT :
closesocket(g_socket) ;
g_socket = INVALID_SOCKET ;
return TRUE ;
case IDC_SEND :
ZeroMemory( g_Buff, sizeof(g_Buff) );
if( GetDlgItemText( hwnd, IDC_MSGEDIT, g_Buff, sizeof(g_Buff) ) > 0 )
{
SetDlgItemText(hwnd, IDC_MSGEDIT, "") ;
SendMsg( g_socket, g_Buff, strlen(g_Buff));
}
break ;
case IDCANCEL :
EndDialog(hwnd, FALSE) ;
return TRUE ;
}
return TRUE ;
case WM_CLIENTMSG :
switch( WSAGETSELECTEVENT(lparam) )
{
case FD_CONNECT :
Select( hwnd, g_socket, WM_CLIENTMSG, FD_READ | FD_CLOSE );
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
return TRUE ;
case FD_READ :
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
RecvMsg( wparam, g_recvbuf, hListWnd );
SendLogMessage( hListWnd, "%s", g_recvbuf );
return TRUE ;
case FD_CLOSE :
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
SendLogMessage( hListWnd, "%s", "Server 가 종료 되었습니다" );
closesocket(g_socket) ;
g_socket = INVALID_SOCKET ;
return TRUE ;
}
return TRUE;
}
return FALSE ;
}
BOOL StartWinsock( )
{
WSADATA wsd;
int ret;
//소켓 라이브러리 초기화
ret = WSAStartup( MAKEWORD(2,2), &wsd );
if( ret == SOCKET_ERROR )
{
AfxMessageBox( "StartWinSock() -> WSAStartup( ) 함수 실패... " );
return FALSE;
}
return TRUE;
}
BOOL CreateSocket(SOCKET *s)
{
*s = socket( AF_INET, SOCK_STREAM, 0 );
if( g_socket == INVALID_SOCKET )
{
AfxMessageBox( "StartWinSock() -> socket( ) 함수 실패... " );
return FALSE;
}
return TRUE;
}
void EndWinsock( )
{
if( g_socket )
closesocket( g_socket );
WSACleanup( );
}
BOOL Select( HWND hwnd, SOCKET s, int Msg, int flag )
{
int ret;
ret = WSAAsyncSelect( s, hwnd, Msg, flag );
if( ret == SOCKET_ERROR )
{
AfxMessageBox( "Select() -> WSAAsyncSelect( ) 함수 실패... " );
return FALSE;
}
return TRUE;
}
BOOL Connect( char *pAddr, short port )
{
struct hostent* host;
struct sockaddr_in sa;
int ret;
host = gethostbyname( pAddr );
ZeroMemory( &sa, sizeof(sa) );
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
// sa.sin_addr.s_addr = inet_addr( pAddr );
여기서 에러 ->sa.sin_addr = *((struct in_addr *)host->h_addr_list[0]);
ret = connect( g_socket, (struct sockaddr *)&sa, sizeof(struct sockaddr));
if( ret == SOCKET_ERROR )
{
if( WSAEWOULDBLOCK == WSAGetLastError() )
return TRUE;
return FALSE;
}
return TRUE;
}
BOOL RecvMsg( SOCKET ClientSocket, char *recvbuf, HWND hwnd )
{
unsigned long recvsize, i ;
int recvbyte;
if( (ioctlsocket( ClientSocket, FIONREAD, &recvsize ) == 0 ) && (recvsize > 0 ) )
{
if( recvbuf != NULL )
ZeroMemory( g_recvbuf, 256 );
for( i = 0; i < recvsize; )
{
recvbyte = recv( ClientSocket, recvbuf + i, recvsize, 0 );
if( recvbyte > 0 )
{
i += (unsigned long)recvbyte;
recvsize = recvsize - recvbyte ;
}
else
{
}
}
}
return TRUE;
}
BOOL SendMsg( SOCKET ClientSocket, char *sendbuff, int size )
{
int ret;
ret = send( ClientSocket, sendbuff, size, 0 );
if( ret == SOCKET_ERROR )
{
AfxMessageBox( "SendMsg() -> send( ) 함수 실패... " );
return FALSE;
}
return TRUE;
}
강사님이 이해하라고 쳐준 소스인데 저 부분에서 에러가 납니다.
왜 에러가 나는지 이유를 몰라서 그럽니다.
#include <windows.h>
#include "resource.h"
#include "ya.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
#define WM_CLIENTMSG (WM_USER + 1)
////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL StartWinsock() ;
BOOL CreateSocket(SOCKET *s) ;
void EndWinsock() ;
BOOL Select( HWND hwnd, SOCKET s, int Msg, int flag ) ;
BOOL Connect( char *pAddr, short port) ;
BOOL RecvMsg( SOCKET ClientSocket, char *recvbuff, HWND hwnd ) ;
BOOL SendMsg( SOCKET ClientSocket, char *sendbuff, int size) ;
////////////////////////////////////////////////////////////////////////////////////////////////////
SOCKET g_socket ;
char g_Buff[100] ;
char g_recvbuf[256] ;
int g_bufsize ;
////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK DlgProc(HWND hwnd, UINT iMsg, WPARAM wparam, LPARAM lparam) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
int ret ;
if(!StartWinsock())
{
AfxMessageBox("StartWinsock() Error") ;
return 0 ;
}
ret = DialogBox(hInstance, MAKEINTRESOURCE( IDD_DIALOG1 ), NULL, ( DLGPROC )DlgProc );
if(ret != 0)
{
AfxMessageBox("StartWinsock() Error") ;
EndWinsock() ;
return 0 ;
}
EndWinsock() ;
return 0 ;
}
BOOL CALLBACK DlgProc(HWND hwnd, UINT iMsg, WPARAM wparam, LPARAM lparam)
{
char IPAddress[50] = {0,} ;
HWND hListWnd ;
short port ;
switch(iMsg)
{
case WM_INITDIALOG :
CreateSocket(&g_socket) ;
Select(hwnd, g_socket, WM_CLIENTMSG, FD_CONNECT) ;
SetWindowText(hwnd, "client") ;
CenterWindow(hwnd) ;
return TRUE ;
case WM_COMMAND :
switch(LOWORD(wparam))
{
case IDC_CONNECT :
if(g_socket == INVALID_SOCKET)
{
CreateSocket(&g_socket) ;
Select(hwnd, g_socket, WM_CLIENTMSG, FD_CONNECT | FD_READ) ;
}
GetDlgItemText( hwnd, IDC_ADDRESS, IPAddress, sizeof(IPAddress) );
port = GetDlgItemInt(hwnd, IDC_PORT, NULL, TRUE) ;
if( Connect( IPAddress, port ) )
{
if( WSAEWOULDBLOCK == WSAGetLastError() )
{
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
SendLogMessage( hListWnd, "Server 접속이 대기중입니다..." );
}
else
{
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
SendLogMessage( hListWnd, "Server 접속이 성공적입니다..." );
}
}
else
{
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
SendLogMessage( hListWnd, "Server 접속에 실패 했습니다..." );
}
return TRUE ;
case IDC_DISCONNECT :
closesocket(g_socket) ;
g_socket = INVALID_SOCKET ;
return TRUE ;
case IDC_SEND :
ZeroMemory( g_Buff, sizeof(g_Buff) );
if( GetDlgItemText( hwnd, IDC_MSGEDIT, g_Buff, sizeof(g_Buff) ) > 0 )
{
SetDlgItemText(hwnd, IDC_MSGEDIT, "") ;
SendMsg( g_socket, g_Buff, strlen(g_Buff));
}
break ;
case IDCANCEL :
EndDialog(hwnd, FALSE) ;
return TRUE ;
}
return TRUE ;
case WM_CLIENTMSG :
switch( WSAGETSELECTEVENT(lparam) )
{
case FD_CONNECT :
Select( hwnd, g_socket, WM_CLIENTMSG, FD_READ | FD_CLOSE );
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
return TRUE ;
case FD_READ :
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
RecvMsg( wparam, g_recvbuf, hListWnd );
SendLogMessage( hListWnd, "%s", g_recvbuf );
return TRUE ;
case FD_CLOSE :
hListWnd = GetDlgItem( hwnd, IDC_RECVLIST );
SendLogMessage( hListWnd, "%s", "Server 가 종료 되었습니다" );
closesocket(g_socket) ;
g_socket = INVALID_SOCKET ;
return TRUE ;
}
return TRUE;
}
return FALSE ;
}
BOOL StartWinsock( )
{
WSADATA wsd;
int ret;
//소켓 라이브러리 초기화
ret = WSAStartup( MAKEWORD(2,2), &wsd );
if( ret == SOCKET_ERROR )
{
AfxMessageBox( "StartWinSock() -> WSAStartup( ) 함수 실패... " );
return FALSE;
}
return TRUE;
}
BOOL CreateSocket(SOCKET *s)
{
*s = socket( AF_INET, SOCK_STREAM, 0 );
if( g_socket == INVALID_SOCKET )
{
AfxMessageBox( "StartWinSock() -> socket( ) 함수 실패... " );
return FALSE;
}
return TRUE;
}
void EndWinsock( )
{
if( g_socket )
closesocket( g_socket );
WSACleanup( );
}
BOOL Select( HWND hwnd, SOCKET s, int Msg, int flag )
{
int ret;
ret = WSAAsyncSelect( s, hwnd, Msg, flag );
if( ret == SOCKET_ERROR )
{
AfxMessageBox( "Select() -> WSAAsyncSelect( ) 함수 실패... " );
return FALSE;
}
return TRUE;
}
BOOL Connect( char *pAddr, short port )
{
struct hostent* host;
struct sockaddr_in sa;
int ret;
host = gethostbyname( pAddr );
ZeroMemory( &sa, sizeof(sa) );
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
// sa.sin_addr.s_addr = inet_addr( pAddr );
여기서 에러 ->sa.sin_addr = *((struct in_addr *)host->h_addr_list[0]);
ret = connect( g_socket, (struct sockaddr *)&sa, sizeof(struct sockaddr));
if( ret == SOCKET_ERROR )
{
if( WSAEWOULDBLOCK == WSAGetLastError() )
return TRUE;
return FALSE;
}
return TRUE;
}
BOOL RecvMsg( SOCKET ClientSocket, char *recvbuf, HWND hwnd )
{
unsigned long recvsize, i ;
int recvbyte;
if( (ioctlsocket( ClientSocket, FIONREAD, &recvsize ) == 0 ) && (recvsize > 0 ) )
{
if( recvbuf != NULL )
ZeroMemory( g_recvbuf, 256 );
for( i = 0; i < recvsize; )
{
recvbyte = recv( ClientSocket, recvbuf + i, recvsize, 0 );
if( recvbyte > 0 )
{
i += (unsigned long)recvbyte;
recvsize = recvsize - recvbyte ;
}
else
{
}
}
}
return TRUE;
}
BOOL SendMsg( SOCKET ClientSocket, char *sendbuff, int size )
{
int ret;
ret = send( ClientSocket, sendbuff, size, 0 );
if( ret == SOCKET_ERROR )
{
AfxMessageBox( "SendMsg() -> send( ) 함수 실패... " );
return FALSE;
}
return TRUE;
}
강사님이 이해하라고 쳐준 소스인데 저 부분에서 에러가 납니다.
왜 에러가 나는지 이유를 몰라서 그럽니다.