问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

vc++6.0编的基于MFC的简单的tcp聊天程序

发布网友 发布时间:2022-05-20 12:23

我来回答

2个回答

热心网友 时间:2023-10-19 09:36

4.1服务器端代码

开启服务器功能:

void OnServerOpen() //开启服务器功能
{
WSADATA wsaData;
int iErrorCode;
char chInfo[64];
if (WSAStartup(WINSOCK_VERSION, &wsaData)) //调用Windows Sockets DLL
{ MessageBeep(MB_ICONSTOP);
MessageBox("Winsock无法初始化!", AfxGetAppName(), MB_OK|MB_ICONSTOP);
WSACleanup();
return; }
else
WSACleanup();
if (gethostname(chInfo, sizeof(chInfo)))
{ ReportWinsockErr("\n无法获取主机!\n ");
return; }
CString csWinsockID = "\n==>>服务器功能开启在端口:No. ";
csWinsockID += itoa(m_pDoc->m_nServerPort, chInfo, 10);
csWinsockID += "\n";
PrintString(csWinsockID); //在程序视图显示提示信息的函数,读者可自行创建
m_pDoc->m_hServerSocket=socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCOL);
//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
if (m_pDoc->m_hServerSocket == INVALID_SOCKET)
{ ReportWinsockErr("无法创建服务器socket!");
return;}
m_pDoc->m_sockServerAddr.sin_family = AF_INET;
m_pDoc->m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;
m_pDoc->m_sockServerAddr.sin_port = htons(m_pDoc->m_nServerPort);
if (bind(m_pDoc->m_hServerSocket, (LPSOCKADDR)&m_pDoc->m_sockServerAddr,
sizeof(m_pDoc->m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
{ReportWinsockErr("无法绑定服务器socket!");
return;}
iErrorCode=WSAAsyncSelect(m_pDoc->m_hServerSocket,m_hWnd,
WM_SERVER_ACCEPT, FD_ACCEPT);
//设定服务器相应的网络事件为FD_ACCEPT,即连接请求,
// 产生相应传递给窗口的消息为WM_SERVER_ACCEPT
if (iErrorCode == SOCKET_ERROR)
{ ReportWinsockErr("WSAAsyncSelect设定失败!");
return;}
if (listen(m_pDoc->m_hServerSocket, QUEUE_SIZE) == SOCKET_ERROR) //开始监听客户连接请求
{ReportWinsockErr("服务器socket监听失败!");
m_pParentMenu->EnableMenuItem(ID_SERVER_OPEN, MF_ENABLED);
return;}
m_bServerIsOpen = TRUE; //监视服务器是否打开的变量
return;
}

响应客户发送聊天文字到服务器:ON_MESSAGE(WM_CLIENT_READ, OnClientRead)

LRESULT OnClientRead(WPARAM wParam, LPARAM lParam)
{
int iRead;
int iBufferLength;
int iEnd;
int iRemainSpace;
char chInBuffer[1024];
int i;
for(i=0;(i
//MAXClient是服务器可响应连接的最大数目
{}
if(i==MAXClient) return 0L;
iBufferLength = iRemainSpace = sizeof(chInBuffer);
iEnd = 0;
iRemainSpace -= iEnd;
iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chInBuffer+iEnd), iSpaceRemaining, NO_FLAGS);
//用可控缓冲接收函数recv()来接收字符
iEnd+=iRead;
if (iBytesRead == SOCKET_ERROR)
ReportWinsockErr("recv出错!");
chInBuffer[iEnd] = '\0';
if (lstrlen(chInBuffer) != 0)
{PrintString(chInBuffer); //服务器端文字显示
OnServerBroadcast(chInBuffer); //自己编写的函数,向所有连接的客户广播这个客户的聊天文字
}
return(0L);
}

对于客户断开连接,会产生一个FD_CLOSE消息,只须相应地用closesocket()关闭相应的Socket即可,这个处理比较简单。

4.2客户端代码

连接到服务器:

void OnSocketConnect()
{ WSADATA wsaData;
DWORD dwIPAddr;
SOCKADDR_IN sockAddr;
if(WSAStartup(WINSOCK_VERSION,&wsaData)) //调用Windows Sockets DLL
{MessageBox("Winsock无法初始化!",NULL,MB_OK);
return;
}
m_hSocket=socket(PF_INET,SOCK_STREAM,0); //创建面向连接的socket
sockAddr.sin_family=AF_INET; //使用TCP/IP协议
sockAddr.sin_port=m_iPort; //客户端指定的IP地址
sockAddr.sin_addr.S_un.S_addr=dwIPAddr;
int nConnect=connect(m_hSocket,(LPSOCKADDR)&sockAddr,sizeof(sockAddr)); //请求连接
if(nConnect)
ReportWinsockErr("连接失败!");
else
MessageBox("连接成功!",NULL,MB_OK);
int iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_READ,FD_READ);
//指定响应的事件,为服务器发送来字符
if(iErrorCode==SOCKET_ERROR)
MessageBox("WSAAsyncSelect设定失败!");
}

接收服务器端发送的字符也使用可控缓冲接收函数recv(),客户端聊天的字符发送使用数据可控缓冲发送函数send(),这两个过程比较简单,在此就不加赘述了。

热心网友 时间:2023-10-19 09:36

又是个要代码的.
有问题你说出一,大家帮你解决嘛,你这样直接要代码,感觉上给你代码,我是在害人啊,我很难做的...
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 VC++ tcp 发送结构体问题 急!!!急!!!急!!! 谁知道衡阳县指定办护照地点? 作文:新鲜事 衡阳市有哪些好的电脑清灰的地方 湖南衡阳出的刘燕育发液怎么样? 衡阳市龙泉的长假发多少钱? 衡阳哪有假发卖 衡阳哪里有假发卖 湖南省衡阳市哪里有假发片卖? 请问衡阳哪里有假发片买? 衡阳市那里有假发卖 衡阳这边哪里有假发卖?要具体的地址不要网址,价格是多少?最好是在衡阳买过的, 衡阳哪里有便宜一点的假发卖,请说明具体地址,店铺名称,谢谢 衡阳哪里有假发卖? 东京大学地震研究所介绍 月经前20天ML,精液蹭在阴道口会导致怀孕吗? 摩托车后视镜加装风挡导致防水套套不上咋办 有关套套前的小囊 安全套的橡皮圈摩的YD疼 为什么带着套套做完后老公的蛋蛋上还有乳白色的?是不是漏了? 有VC基础,能做这个软件吗?VC++和SQL和TCP/Socket相关 VC++ Socket (这个问题有点牵强) VC 怎么知道socket结束了 vmware horizon client安装时,新建服务器那栏怎样填 C++C/S模型下客户端向服务器端发送汉字 剑桥滤片是什么? VC2008运行时出现Loaded 'C:\WINDOWS\system32\ntdll.dll'是怎么回事 什么是澈耳西滤片 流式细胞仪带通滤光片500/25是什么意思? 白色圆柱型滤片 汽车电瓶上的 是什么? PM2.5级空气颗粒过滤片是什么材料组成 请教监控摄像机的滤光片的作用是什么?双滤光片的功能是什么? 未转变者的滤片是怎么样? 我想用PS通道工具做单色滤片,为什么打开单色通道是黑白的?怎么调? CPU时i7 8700 开机使用待机CPU温度正常 但是一玩游戏温度就过热? i7 8700k内置的温度传感器设置强制断电温度是多少 i7 8700温度跳动很大有问题吗(待机)? i7 8700k开机后cpu温度就一直上升。飙升89℃后就没变化。这是什么原因导致的? I7 8700k鲁大师测试温度异常115度 i7 8700跑战地1,CPU最高温度68度,平均54度,正常吗