mfc做一个网络聊天工具
程序中写了两个类,CServer和CClent类,
分别是:
/**************CServer****************/
private:
void ServerInit();
public:
BOOL InitAndListen(HWND hwnd,UINT port);
public:
SOCKET m_hSocket; //socket 句柄
SOCKET m_connect;
sockaddr_in m_addr;
UINT m_uPort;
HWND m_hWnd;
/******************.cpp**************/
CServer::CServer()
{
}
CServer::~CServer()
{
WSAAsyncSelect(m_hSocket, m_hWnd, 0, 0);
}
BOOL CServer::InitAndListen(HWND hwnd,UINT port)
{
m_uPort=port;
m_hWnd=hwnd;
if(m_hSocket != NULL)
{
//如果已经创建了套接字先关闭原来的
closesocket(m_hSocket);
m_hSocket = NULL;
}
if(m_hSocket == NULL)
{
//创建新的套接字,这里是创建的流类型的套接字
m_hSocket = socket(AF_INET, SOCK_STREAM,0);
ASSERT(m_hSocket != NULL);
ServerInit();
}
m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = INADDR_ANY;
m_addr.sin_port = htons(m_uPort);
int ret = 0;
int error = 0;
//绑定一个套接字到本机的地址
ret = bind(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));
if(ret == SOCKET_ERROR)
{ //绑定错误
AfxMessageBox("已经建立服务器!");
return FALSE;
}
//开始一个侦听过程,等待客户的连接
ret = listen(m_hSocket, 5); //这里的第二个参数表示最多支持的客户连接数
if(ret == SOCKET_ERROR)
{ //listen失败
AfxMessageBox("监听失败!");
return FALSE;
}
return TRUE;
}
void CServer::ServerInit()
{
if(WSAAsyncSelect(m_hSocket, m_hWnd, SER_MESSAGE, FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE)>0)
AfxMessageBox("选择错误");
}
/*****************CClent******************/
#include "winsock.h"
private:
void ClientInit();
public:
BOOL InitAndConnet(HWND hwnd,UINT port,CString m_strServer);
void GetString(CString & str);
void SendString(CString a);
public:
CString m_strServer;
SOCKET m_hSocket;
sockaddr_in m_addr;
UINT m_uPort;
HWND m_hWnd;
CClient::CClient()
{
m_hSocket =NULL;
}
CClient::~CClient()
{
}
BOOL CClient::InitAndConnet(HWND hwnd,UINT port,CString strserver)
{
m_hWnd=hwnd;
m_uPort=port;
m_strServer=strserver;
if(m_hSocket != NULL)
{
//如果原来打开这套接字先关闭
closesocket(m_hSocket);
m_hSocket = NULL;
}
if(m_hSocket == NULL)
{
//创建新的流套接字
m_hSocket = socket(AF_INET, SOCK_STREAM,0);
ASSERT(m_hSocket != NULL);
ClientInit();
}
//准备服务器的信息,这里需要指定服务器的地址
m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = inet_addr(m_strServer.GetBuffer(0));
m_addr.sin_port = htons(m_uPort); //改变端口号的数据格式
//这里主动连接服务器,该过程将等待一定时间
int ret = 0;
int error = 0;
ret = connect(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));
if(ret == SOCKET_ERROR)
{//连接失败
if(GetLastError()!=WSAEWOULDBLOCK)
{
AfxMessageBox(_T("请确认服务器确实已经打开并工作在同样的端口!"));
return FALSE;
}
}
return TRUE;
}
void CClient::SendString(CString a)
{
if(send(m_hSocket,a.GetBuffer(0),a.GetLength(),0)==SOCKET_ERROR)
{
AfxMessageBox("客户端发送数据错误");
}
}
void CClient::GetString(CString &str)
{
recv(m_hSocket,str.GetBuffer(0),1024,MSG_DONTROUTE);
}
void CClient::ClientInit()
{
if(WSAAsyncSelect(m_hSocket,m_hWnd,CLI_MESSAGE,FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT)>0)
{
AfxMessageBox("选择错误");
}
}
定义对象,调用函数就可以了
mfc做一个网络聊天工具相关推荐
- 自己动手做一个局域网聊天工具(一)
作者:朱金灿 来源:http://blog.csdn.net/clever101 现在部门使用的局域网聊天工具是飞秋,但是飞秋总是不够稳定,有时会掉线.这使我萌生一个念头:做一个局域网聊天工具. ...
- JAVA进阶案例 TCP编程之网络聊天工具(服务端)
实现分析. 1.开启服务端 客户端选择'登录以后'后,提示输入用户名和密码,验证成功则进入好友列表界面 2.用户聊天 双击好友,进入好友聊天界面.在信息框编辑信息 点击发送 当客户端向服务端发送数据时 ...
- 基于WebServices简易网络聊天工具的设计与实现
基于WebServices简易网络聊天工具的设计与实现 Copyright 朱向洋 Sunsea ALL Right Reserved 一.项目内容 本次课程实现一个类似QQ的网络聊天软件的功能:服务 ...
- TcpClient和TcpListener 类的使用-编写一个点对点聊天工具(初级入门篇)
TcpClient类和TcpListener类属于.NET框架下网络通信中的应用层类,为Socket通信提供了更简单,对用户更为友好的接口.应用层类比位于底层的Socket类提供了更高层次的抽象,封装 ...
- 个人看法---如何做一个视频聊天室?
个人而言,做一个视频聊天室,是可以自己建的,不过比较废资源,也不一定做得好: 另外,可以考虑选用第三方即时通讯云的方式,也比较常见.不过这块要注意几个问题: 一.即时通讯云商是否掌握即时通讯核心技术, ...
- 基于TCP,Socket编程,模仿腾讯QQ界面,使用Java开发的一款网络聊天工具。QQ_Chat
代码下载地址 原博客地址 QQ_Chat 基于TCP,Socket编程,模仿腾讯QQ界面,使用Java开发的一款网络聊天工具. (内含报告) 工具: Eclipse.Navicat for MySQL ...
- 聊天系统设计与实现服务器代码,网络聊天工具系统的设计与实现.doc
PAGE 综合课程设计报告 网络聊天工具系统的设计与实现 学生姓名: 指导教师: 所 在 系: 电 子 信 息 系 所学专业: 计算机科学与技术 年 级: PAGE 1 1 目 录 TOC \o &q ...
- 基于UDP协议的局域网网络聊天工具
/* * 本程序实现了基于UDP协议的局域网网络聊天工具. * 参考网上的源码,发现一个calss就可以搞定. * ChatFrame类创建窗口,包含JTextField和TextArea. * 前者 ...
- 【亡羊补牢】计算机网络灵魂之问 第9期 如果让你做一个视频聊天软件,你用tcp还是udp?为什么?
这是博主面向腾讯学习的面试题大整理系列,可以在如下github仓库Issues中通过 Labels 标签分类查看相关内容,同时欢迎大家指正可能的错误并且提出自己的解答,希望大家学的鱼块,春秋招顺利! ...
最新文章
- python 学习 [day8]class成员
- SQL Server 自定义快捷键
- 关于CEdit控件的透明
- Python必备封装基本代码~Python函数
- 测开之路二十二:迭代器、生成器
- byte[] 转化为 string 转化为汉字和字母
- 用什么软件测试固态硬盘坏没坏,SSD能用多久在哪看 检测固态硬盘寿命方法
- crio电压采集 labview_基于LabVIEW和CompactRIO开发的EDM过程控制器
- 国内下载Android源码教程
- melp算法matlab,svpwm过调制算法研究与实现 [MELP声码器的算法研究及实现]
- 在项目中怎样写故障树或者类层次
- 在电脑上如何直接下载秒拍的视频?
- 剖析 Microsoft.AspNetCore.Identity 的精髓 —— 前言
- 想把语音转成文字,就这样做
- GEE:基于GEE的单个湖泊的实时水体提取(以武汉东湖为例)
- 华为 eNSP easy ip转换实验+NAT服务器
- JMeter 图片上传接口进行压力测试
- mac重装系统 未能与恢复服务器,Mac系统重装后数据可不可以恢复
- 求1+2!+3!+...+N!的和
- 黑人太管用计算机来打出来的音乐,求欧美黑人饶舌歌曲,节奏感要很强劲的那种。。。 (在百度上搜了,对味的只有少数)...
热门文章
- MRPII/ERP对企业经营方式转变的影响(转)
- tcp网络服务模型,redis,nginx,memcached一起搞定
- Tina R329 swupdate OTA升级步骤
- Learning to Track with Object Permanence GRU模块以及损失函数解析
- 【电力电子技术DC-AC】单相双极性SPWM逆变电路 Simulink仿真
- 报错:PicklingError: Can‘t pickle <type ‘function‘>: attribute lookup __builtin__.function failed
- SMMU架构手册之数据结构和转换流程(1)
- Git小白字典——Git基本命令大全
- from math import *
- 使用 Python 模块 bluepy 玩转 BLE