TCP聊天室06 客户端程序设计(非阻塞模式)

//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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值