//Client.cpp
/*--------------------------------------------------------------------
使用 TCP 协议的聊天室客户端程序(非阻塞模式)
--------------------------------------------------------------------*/
#include <windows.h>
#include <strsafe.h>
#include "resource.h"
#include "Msg.h"
#pragma comment(lib,"WS2_32.lib")
#define TCP_PORT 1234
#define WM_SOCKET WM_USER + 100
TCHAR szApp[] = TEXT("ChatClient(NonBlock)");
TCHAR szErrIp[] = TEXT("无效的服务器IP地址!");
TCHAR szErrConn[] = TEXT("无法连接到服务器!");
TCHAR szErrLogin[] = TEXT("无法登录到服务器,请检查用户名密码!");
TCHAR szSpar[] = TEXT(" : ");
typedef struct SSockParamEx{
TCHAR szUser[32];
TCHAR szPwd[32];
TCHAR szText[256];
char szSrv[16];
HWND hWnd;
SOCKET hSock;
int iLastTime;
int iSendBuff;
PSMSGPKG pSendMsg;
int iRecvBuff;
PSMSGPKG pRecvMsg;
int iStep;
}SSOCKPARAMEX, *PSSOCKPARAMEX;
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI WorkThread(LPVOID lpParameter);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)
{
DialogBox(hInstance, TEXT("CHATCLIENT"), NULL, DlgProc);
return 0;
}
void EnableWndCtrls(HWND hWnd, BOOL bEnable)
{
EnableWindow(GetDlgItem(hWnd, IDC_SERVER), bEnable);
EnableWindow(GetDlgItem(hWnd, IDC_USER), bEnable);
EnableWindow(GetDlgItem(hWnd, IDC_PASS), bEnable);
EnableWindow(GetDlgItem(hWnd, IDC_LOGIN), bEnable);
}
/*********************************************************************
断开连接
*********************************************************************/
void DisConn(PSSOCKPARAMEX pSockParamEx)
{
EnableWindow(GetDlgItem(pSockParamEx->hWnd, IDC_TEXT), FALSE);
EnableWindow(GetDlgItem(pSockParamEx->hWnd, IDC_LOGOUT), FALSE);
if(pSockParamEx->hSock){
closesocket(pSockParamEx->hSock);
pSockParamEx->hSock = NULL;
}
EnableWndCtrls(pSockParamEx->hWnd, TRUE);
}
/*********************************************************************
连接到服务器
*********************************************************************/
void Conn(PSSOCKPARAMEX pSockParamEx)
{
EnableWndCtrls(pSockParamEx->hWnd, FALSE);
pSockParamEx->iStep = pSockParamEx->iSendBuff = pSockParamEx->iRecvBuff = 0;
SOCKADDR_IN stSa;memset(&stSa, 0, sizeof(SOCKADDR_IN));
//解析IP地址
int iRet = inet_addr(pSockParamEx->szSrv);
if(iRet == INADDR_NONE){
MessageBox(NULL, szErrIp, szApp, MB_OK|MB_ICONSTOP);
DisConn(pSockParamEx);
}
stSa.sin_family = AF_INET; stSa