is there any way to make this code.. err... more slimline and more efficient?
#include <winsock2.h>
#include <windows.h>
#include "resource.h"
#define WIN32_LEAN_AND_MEAN
#define WM_SOCKET 100
#define IDC_EDIT_OUT 101
#define IDC_EDIT_IN 102
#define IDC_ListBox 2000
void vShowText(HWND hChildHandle, char *szText);
char szServer[15] = "127.0.0.1";
char RecvData[100];
char SendData[100] = "REQ";
int SendBytes = 0;
int RecvBytes = 0;
int nResult = 0;
int iResult = 0;
char buffer[100];
char error[100];
SOCKADDR_IN SockAddr;
SOCKET Socket = NULL;
HWND hlistbox = NULL;
HWND hEditOut = NULL;
HWND hEditIn = NULL;
LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_CREATE:
{
hlistbox = CreateWindowEx(NULL, "Listbox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER, 2, 40, 380, 160, hwnd, (HMENU)IDC_ListBox, GetModuleHandle(NULL), NULL);
if(!hlistbox)
{
MessageBox(hwnd, "Could not create incoming edit box.", "Error", MB_OK | MB_ICONERROR);
}
HGDIOBJ hfDefault = GetStockObject(DEFAULT_GUI_FONT);
hEditOut=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD|WS_VISIBLE|ES_AUTOVSCROLL|ES_AUTOHSCROLL, 2, 2, 160, 20, hwnd, (HMENU)IDC_EDIT_IN, GetModuleHandle(NULL), NULL);
if(!hEditOut)
{
MessageBox(hwnd, "Could not create outgoing edit box.", "Error", MB_OK|MB_ICONERROR);
}
SendMessage(hEditOut, WM_SETTEXT, NULL, (LPARAM)"127.0.0.1");
WSADATA WsaDat;
nResult = WSAStartup(MAKEWORD(2,2), &WsaDat);
if (nResult != 0)
{
MessageBox(hwnd, "Winsock Initialization Failed", "Critical Error", MB_OK);
SendMessage(hwnd, WM_DESTROY, 0, 0);
break;
}
memset(&SockAddr, 0, sizeof(sockaddr_in));
memset(&RecvData, 0, sizeof(RecvData));
memset(buffer, 0, sizeof(buffer));
Socket = socket(AF_INET, SOCK_STREAM, 0);
if (Socket == INVALID_SOCKET)
{
MessageBox(hwnd, "Socket creation failed", "Critical Error", MB_OK);
SendMessage(hwnd, WM_DESTROY, 0, 0);
break;
}
nResult = WSAAsyncSelect(Socket, hwnd, WM_SOCKET, (FD_CONNECT | FD_READ | FD_CLOSE));
if (nResult)
{
MessageBox(hwnd, "WSAAsyncSelect failed", "Critical Error", MB_OK);
SendMessage(hwnd, WM_DESTROY, 0, 0);
break;
}
}break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
return(0);
}break;
case WM_DESTROY:
{
closesocket(Socket);
WSACleanup();
PostQuitMessage(0);
}break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case MENU_FILE_CONNECT:
{
SendMessage(hEditOut, WM_GETTEXT, sizeof(szServer), (LPARAM)(LPSTR)szServer);
SockAddr.sin_addr.s_addr = inet_addr(szServer);
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = htons(2006);
iResult = connect(Socket, (struct sockaddr*)&SockAddr, sizeof(sockaddr));
if (iResult == SOCKET_ERROR)
{
wsprintf(error, TEXT("Error Code: %d"), WSAGetLastError());
MessageBox(hwnd, error, "Critical Error", MB_OK);
return(0);
}
}break;
case MENU_FILE_GET:
{
SendBytes = send(Socket, SendData, sizeof(SendData), 0);
memset(RecvData, 0, sizeof(RecvData));
}break;
default:break;
}
}break;
case WM_SOCKET:
{
if (WSAGETSELECTERROR(lParam))
{
MessageBox(hwnd, "Connection to server failed", "ERROR", MB_OK);
SendMessage(hwnd, WM_DESTROY, 0, 0);
break;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
char szIncoming[100];
ZeroMemory(szIncoming, sizeof(szIncoming));
RecvBytes = recv(Socket, (char*)szIncoming, sizeof(szIncoming)/sizeof(szIncoming[0]), 0);
vShowText(hlistbox, szIncoming);
}break;
case FD_CONNECT:
{
}break;
case FD_CLOSE:
{
closesocket(Socket);
}break;
default:break;
}
}break;
}
return(DefWindowProc(hwnd, uMsg, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX wc;
HWND hwnd;
wc.cbClsExtra = 0;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbWndExtra = 0;
wc.hbrBackground = HBRUSH(GetStockObject(BLACK_BRUSH));
wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wc.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WinProc;
wc.lpszClassName = "myClass";
wc.lpszMenuName = "MainMenu";
wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_OWNDC;
if (!(RegisterClassEx(&wc)))
{
return(0);
}
if (!(hwnd = CreateWindowEx(NULL, "myClass", "Async Client", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 200, 200, 800, 600, NULL, NULL, hInstance, NULL)))
{
return(0);
}
MSG msg;
while(TRUE)
{
GetMessage(&msg, NULL, 0, 0);
if(msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return(0);
}
void vShowText(HWND hChildHandle, char *szText)
{
int Line;
SendMessage(hChildHandle,LB_ADDSTRING,0,(LPARAM)szText);
Line = SendMessage(hChildHandle,LB_GETCOUNT,0,0);
SendMessage(hChildHandle,LB_SETCURSEL,Line-1,0);
SendMessage(hChildHandle,LB_SETCURSEL,-1,0);
}