【网络编程】之七、select聊天室
好久没有用MFC 来写代码了,手都生疏了,悲剧啊,好多API 都去查的 哎~~~
好了 下面把 我们聊天室的代码贴出:
select函数封装:
- BOOL CserverDlg::Select_Server(SOCKET sock, int nTime /* = 100 */, BOOL bRead /* = TRUE */)
- {
- fd_set fdset;
- timeval tv;
- FD_ZERO(&fdset);
- FD_SET(sock, &fdset);
- nTime = nTime > 1000 ? 1000 : nTime;
- tv.tv_sec = 0;
- tv.tv_usec = nTime;
- int iRet = 0;
- if ( bRead ) {
- iRet = select(0, &fdset, NULL , NULL, &tv);
- }else{
- iRet = select(0, NULL , &fdset, NULL, &tv);
- }
- if(iRet <= 0) {
- return FALSE;
- } else if (FD_ISSET(sock, &fdset)){
- return TRUE;
- }
- return FALSE;
- }
下面是线程函数,分别是服务器和客户端的:
- static UINT __cdecl ThreadProc(LPVOID pParam);
- UINT CserverDlg::ThreadProc(LPVOID lpParameter )
- {
- ASSERT(lpParameter);
- CserverDlg *lthis = (CserverDlg*)lpParameter;
- sockaddr_in clientAddr = {0};
- WSADATA wsaData;
- WORD sockVersion = MAKEWORD (2, 0);
- ::WSAStartup(sockVersion, &wsaData);
- lthis ->m_sSock = INVALID_SOCKET;
- lthis ->m_sSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (lthis ->m_sSock == INVALID_SOCKET)
- {
- AfxMessageBox("error");
- ::WSACleanup();
- return TRUE;
- }
- sockaddr_in ser;
- ser.sin_family = AF_INET;
- ser.sin_port = htons(8888);
- ser.sin_addr.S_un.S_addr = INADDR_ANY;
- if (::bind(lthis->m_sSock, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR)
- {
- AfxMessageBox("error");
- WSACleanup();
- return TRUE;
- }
- if (listen(lthis->m_sSock, 2) == SOCKET_ERROR)
- {
- AfxMessageBox("error");
- WSACleanup();
- return TRUE;
- }
- int nclientAddr = sizeof(clientAddr);
- lthis ->m_sClient = accept(lthis->m_sSock, (SOCKADDR*)&clientAddr, &nclientAddr);
- if (lthis->m_sClient == INVALID_SOCKET)
- {
- AfxMessageBox("error");
- return TRUE;
- }
- while(TRUE)
- {
- if (lthis->Select_Server(lthis->m_sClient) == TRUE)
- {
- TCHAR recvMeg[1024] = {0};
- int re = recv(lthis->m_sClient, (char*)recvMeg, 1024, 0);
- if (re > 0)
- {
- recvMeg[re] = '\n';
- lthis->recvMeg(recvMeg);
- }
- else
- {
- lthis->recvMeg("客户端下线");
- break;
- }
- }
- Sleep(500);
- }
- if (lthis->m_sClient != INVALID_SOCKET)
- {
- closesocket(lthis->m_sClient);
- }
- if (lthis->m_sSock != INVALID_SOCKET)
- {
- closesocket(lthis->m_sSock);
- }
- WSACleanup();
- return TRUE;
- }
- static UINT __cdecl ThreadProc(LPVOID pParam);
- UINT CclientDlg::ThreadProc(LPVOID pParam)
- {
- ASSERT(pParam);
- CclientDlg* lthis = (CclientDlg*)pParam;
- WSADATA wsaData;
- WORD sockVersion = MAKEWORD(2, 0);
- ::WSAStartup(sockVersion, &wsaData);
- lthis->m_Sock = INVALID_SOCKET;
- lthis->m_Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (lthis->m_Sock == INVALID_SOCKET)
- {
- AfxMessageBox("error");
- return TRUE;
- }
- sockaddr_in serAdd;
- serAdd.sin_family = AF_INET;
- serAdd.sin_port = htons(8888);
- serAdd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
- if (connect(lthis->m_Sock, (sockaddr*)&serAdd, sizeof(serAdd)) == SOCKET_ERROR)
- {
- AfxMessageBox("error");
- return TRUE;
- }
- while (TRUE)
- {
- TCHAR buff[1024] = {0};
- if (lthis->Select_Server(lthis->m_Sock))
- {
- int nrecv;
- nrecv = recv(lthis->m_Sock, buff, 1024, 0);
- if (nrecv > 0)
- {
- buff[nrecv] = '\n';
- lthis->recvMeg(buff);
- }
- else
- {
- lthis->recvMeg("服务器终止");
- break;
- }
- }
- Sleep(500);
- }
- if (lthis->m_Sock != INVALID_SOCKET)
- {
- closesocket(lthis->m_Sock);
- }
- WSACleanup();
- return TRUE;
- }
发送信息:
- void CserverDlg::OnBnClickedButsend()
- {
- // TODO: 在此添加控件通知处理程序代码
- CString strsend;
- ASSERT(m_sClient != INVALID_SOCKET);
- GetDlgItemText(IDC_SEND, strsend);
- if (!strsend.IsEmpty() && Select_Server(m_sClient, 100, FALSE))
- {
- send(m_sClient, strsend, strlen(strsend), 0);
- SetDlgItemText(IDC_SEND, "");
- }
- }
完整代码下载
2012/8/28
jofranks 于南昌
版权声明:本文为博主原创文章,未经博主允许不得转载。
【网络编程】之七、select聊天室相关推荐
- Linux下Socket网络编程之点对点聊天室
1. 系统设计的目的与意义 掌握信号与信号处理的概念,了解点对点聊天室的设计需求,掌握相关的理论知识,切实掌握程序设计的分析方法,勇于实践,多参考开源项目和代码.实现点对点聊天室程序设计,Linux网 ...
- Java网络编程——多人聊天室
多用户即时通信系统 需求分析: 1.用户登录 2.拉取在线用户列表 3.无异常退出 4.私聊 5.群聊 6.发送文件 7.服务器推送新闻 多用户登录 老韩的课程讲的真的很清楚: 关于Java多线程的文 ...
- Java网络编程,一对一聊天
Java网络编程,一对一聊天 **这个小任务是来自于B站,他的视频名字就是"Java实现实时聊天互动程序"** 要求:就是有2个类,其中一个客户端和一个服务端.要实现从客户端发消息 ...
- Socket编程实现简易聊天室
1.Socket基础知识 Socket(套接字)用于描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发出请求或者应答网络请求. Socket是支持TCP/IP协议的网络通信的基本 ...
- java网络编程实现一个聊天程序
网络编程 l网络模型 OSI参考模型 TCP/IP参考模型 l网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 lIP地址:InetAddress 网络中设备的标识 不易记忆,可用 ...
- Java_常瑞鹏 java_网络编程实现一个 聊天程序
网络编程 l网络模型 OSI参考模型 TCP/IP参考模型 l网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 lIP地址:InetAddress 网络中设备的标识 不易记忆,可用 ...
- TCP网络编程之chat聊天室
这一节我们再讲一个tcp长连接的例子,实现网络聊天室的基本功能. 聊天室的基本原理:采用Client/Server TCP架构,客户端发送消息给服务器,服务器再把消息转发给所有的客户端. 一.需求分析 ...
- Linux网络编程之PHP聊天室Workerman-chat
云服务器上搭建"PHP聊天室框架" 一.简介: 在服务器上搭建PHP聊天室框架{workerman-chat}具体步骤 1. 准备云服务器 购买阿里云服务器 [可选购买其他云服务器 ...
- 网络编程多人聊天c语言,网络编程之TCP多人聊天
服务端转发信息: from socket import * from threading import Thread sockets=[] def main(): server_socket=sock ...
最新文章
- 使用DOSBox编译汇编代码
- html的混合标记,HTML XPath:提取与多个标签混合的文本?
- Storm-Flux简介
- 应用程序错误 应用程序发生异常w3wp.exe
- 云图说|一张图看懂一站式DevOps利器——华为云DevCloud
- 提到强化学习只知道AlphaGo?其实,RL在工业界还有这些应用
- mysql创建的数据库保存在哪里_在MySQL中创建数据库时,我的数据库保存在哪里?...
- 汽车品牌查询及车型大全查询
- ARM920T及其MMU,Cache学习杂记(一)
- 视频会议的进化方向是什么?
- python调用word报错,提示“服务器运行失败”,现已解决
- 【邱锡鹏-神经网络与深度学习】第一章绪论 知识点汇总
- haar adaboost matlab,人脸检测算法之Haar-Adaboost分类器原理
- 基于FPGA的图像处理之幂律(伽马校正)变化
- 爬虫 使用python+requests模块爬取12306网站的车次信息
- 詹姆斯·高斯林-JAVA之父
- 利用Python进行王者荣耀壁纸下载
- vue里面的ref详解
- 海康威视新手上路:MFC连接球机
- 杜绝迅雷上传数据的方法
热门文章
- MybatisPlus入门之介绍
- SpringBoot_数据访问-整合MyBatis(二)-注解版MyBatis
- java gridlayout 设置列宽_java 利用GridBagLayout布局时,如何设置单列列宽?
- ubuntu中supervisor的安装和学习
- JAVA数据类型的转换及数据的原反补三码
- JAVA面试题(20)
- Vue 动态创建实例
- VS2017 installed in a different location
- 智能推荐:“相关性搜索”只给你最想要的
- 用python写网络爬虫 -从零开始 3 编写ID遍历爬虫