好久没有用MFC 来写代码了,手都生疏了,悲剧啊,好多API 都去查的  哎~~~

好了 下面把 我们聊天室的代码贴出:

select函数封装:

[cpp] view plaincopy
  1. BOOL CserverDlg::Select_Server(SOCKET sock, int nTime /* = 100 */, BOOL bRead /* = TRUE */)
  2. {
  3. fd_set fdset;
  4. timeval tv;
  5. FD_ZERO(&fdset);
  6. FD_SET(sock, &fdset);
  7. nTime = nTime > 1000 ? 1000 : nTime;
  8. tv.tv_sec  = 0;
  9. tv.tv_usec = nTime;
  10. int iRet = 0;
  11. if ( bRead ) {
  12. iRet = select(0, &fdset, NULL , NULL, &tv);
  13. }else{
  14. iRet = select(0, NULL , &fdset, NULL, &tv);
  15. }
  16. if(iRet <= 0) {
  17. return FALSE;
  18. } else if (FD_ISSET(sock, &fdset)){
  19. return TRUE;
  20. }
  21. return FALSE;
  22. }

下面是线程函数,分别是服务器和客户端的:

[cpp] view plaincopy
  1. static UINT __cdecl ThreadProc(LPVOID pParam);
[cpp] view plaincopy
  1. UINT CserverDlg::ThreadProc(LPVOID lpParameter )
  2. {
  3. ASSERT(lpParameter);
  4. CserverDlg *lthis = (CserverDlg*)lpParameter;
  5. sockaddr_in clientAddr = {0};
  6. WSADATA wsaData;
  7. WORD sockVersion = MAKEWORD (2, 0);
  8. ::WSAStartup(sockVersion, &wsaData);
  9. lthis ->m_sSock = INVALID_SOCKET;
  10. lthis ->m_sSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  11. if (lthis ->m_sSock == INVALID_SOCKET)
  12. {
  13. AfxMessageBox("error");
  14. ::WSACleanup();
  15. return TRUE;
  16. }
  17. sockaddr_in ser;
  18. ser.sin_family = AF_INET;
  19. ser.sin_port = htons(8888);
  20. ser.sin_addr.S_un.S_addr = INADDR_ANY;
  21. if (::bind(lthis->m_sSock, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR)
  22. {
  23. AfxMessageBox("error");
  24. WSACleanup();
  25. return TRUE;
  26. }
  27. if (listen(lthis->m_sSock, 2) == SOCKET_ERROR)
  28. {
  29. AfxMessageBox("error");
  30. WSACleanup();
  31. return TRUE;
  32. }
  33. int nclientAddr = sizeof(clientAddr);
  34. lthis ->m_sClient = accept(lthis->m_sSock, (SOCKADDR*)&clientAddr, &nclientAddr);
  35. if (lthis->m_sClient == INVALID_SOCKET)
  36. {
  37. AfxMessageBox("error");
  38. return TRUE;
  39. }
  40. while(TRUE)
  41. {
  42. if (lthis->Select_Server(lthis->m_sClient) == TRUE)
  43. {
  44. TCHAR recvMeg[1024] = {0};
  45. int re = recv(lthis->m_sClient, (char*)recvMeg, 1024, 0);
  46. if (re > 0)
  47. {
  48. recvMeg[re] = '\n';
  49. lthis->recvMeg(recvMeg);
  50. }
  51. else
  52. {
  53. lthis->recvMeg("客户端下线");
  54. break;
  55. }
  56. }
  57. Sleep(500);
  58. }
  59. if (lthis->m_sClient != INVALID_SOCKET)
  60. {
  61. closesocket(lthis->m_sClient);
  62. }
  63. if (lthis->m_sSock != INVALID_SOCKET)
  64. {
  65. closesocket(lthis->m_sSock);
  66. }
  67. WSACleanup();
  68. return TRUE;
  69. }
[cpp] view plaincopy
  1. static UINT __cdecl ThreadProc(LPVOID pParam);
[cpp] view plaincopy
  1. UINT CclientDlg::ThreadProc(LPVOID pParam)
  2. {
  3. ASSERT(pParam);
  4. CclientDlg* lthis = (CclientDlg*)pParam;
  5. WSADATA wsaData;
  6. WORD sockVersion = MAKEWORD(2, 0);
  7. ::WSAStartup(sockVersion, &wsaData);
  8. lthis->m_Sock = INVALID_SOCKET;
  9. lthis->m_Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  10. if (lthis->m_Sock == INVALID_SOCKET)
  11. {
  12. AfxMessageBox("error");
  13. return TRUE;
  14. }
  15. sockaddr_in serAdd;
  16. serAdd.sin_family = AF_INET;
  17. serAdd.sin_port = htons(8888);
  18. serAdd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  19. if (connect(lthis->m_Sock, (sockaddr*)&serAdd, sizeof(serAdd)) == SOCKET_ERROR)
  20. {
  21. AfxMessageBox("error");
  22. return TRUE;
  23. }
  24. while (TRUE)
  25. {
  26. TCHAR buff[1024] = {0};
  27. if (lthis->Select_Server(lthis->m_Sock))
  28. {
  29. int nrecv;
  30. nrecv = recv(lthis->m_Sock, buff, 1024, 0);
  31. if (nrecv > 0)
  32. {
  33. buff[nrecv] = '\n';
  34. lthis->recvMeg(buff);
  35. }
  36. else
  37. {
  38. lthis->recvMeg("服务器终止");
  39. break;
  40. }
  41. }
  42. Sleep(500);
  43. }
  44. if (lthis->m_Sock != INVALID_SOCKET)
  45. {
  46. closesocket(lthis->m_Sock);
  47. }
  48. WSACleanup();
  49. return TRUE;
  50. }

发送信息:

[cpp] view plaincopy
  1. void CserverDlg::OnBnClickedButsend()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. CString strsend;
  5. ASSERT(m_sClient != INVALID_SOCKET);
  6. GetDlgItemText(IDC_SEND, strsend);
  7. if (!strsend.IsEmpty() && Select_Server(m_sClient, 100, FALSE))
  8. {
  9. send(m_sClient, strsend, strlen(strsend), 0);
  10. SetDlgItemText(IDC_SEND, "");
  11. }
  12. }

完整代码下载

2012/8/28

jofranks 于南昌

版权声明:本文为博主原创文章,未经博主允许不得转载。

【网络编程】之七、select聊天室相关推荐

  1. Linux下Socket网络编程之点对点聊天室

    1. 系统设计的目的与意义 掌握信号与信号处理的概念,了解点对点聊天室的设计需求,掌握相关的理论知识,切实掌握程序设计的分析方法,勇于实践,多参考开源项目和代码.实现点对点聊天室程序设计,Linux网 ...

  2. Java网络编程——多人聊天室

    多用户即时通信系统 需求分析: 1.用户登录 2.拉取在线用户列表 3.无异常退出 4.私聊 5.群聊 6.发送文件 7.服务器推送新闻 多用户登录 老韩的课程讲的真的很清楚: 关于Java多线程的文 ...

  3. Java网络编程,一对一聊天

    Java网络编程,一对一聊天 **这个小任务是来自于B站,他的视频名字就是"Java实现实时聊天互动程序"** 要求:就是有2个类,其中一个客户端和一个服务端.要实现从客户端发消息 ...

  4. Socket编程实现简易聊天室

    1.Socket基础知识 Socket(套接字)用于描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发出请求或者应答网络请求. Socket是支持TCP/IP协议的网络通信的基本 ...

  5. java网络编程实现一个聊天程序

    网络编程 l网络模型 OSI参考模型 TCP/IP参考模型 l网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 lIP地址:InetAddress 网络中设备的标识 不易记忆,可用 ...

  6. Java_常瑞鹏 java_网络编程实现一个 聊天程序

    网络编程 l网络模型 OSI参考模型 TCP/IP参考模型 l网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 lIP地址:InetAddress 网络中设备的标识 不易记忆,可用 ...

  7. TCP网络编程之chat聊天室

    这一节我们再讲一个tcp长连接的例子,实现网络聊天室的基本功能. 聊天室的基本原理:采用Client/Server TCP架构,客户端发送消息给服务器,服务器再把消息转发给所有的客户端. 一.需求分析 ...

  8. Linux网络编程之PHP聊天室Workerman-chat

    云服务器上搭建"PHP聊天室框架" 一.简介: 在服务器上搭建PHP聊天室框架{workerman-chat}具体步骤 1. 准备云服务器 购买阿里云服务器 [可选购买其他云服务器 ...

  9. 网络编程多人聊天c语言,网络编程之TCP多人聊天

    服务端转发信息: from socket import * from threading import Thread sockets=[] def main(): server_socket=sock ...

最新文章

  1. 使用DOSBox编译汇编代码
  2. html的混合标记,HTML XPath:提取与多个标签混合的文本?
  3. Storm-Flux简介
  4. 应用程序错误 应用程序发生异常w3wp.exe
  5. 云图说|一张图看懂一站式DevOps利器——华为云DevCloud
  6. 提到强化学习只知道AlphaGo?其实,RL在工业界还有这些应用
  7. mysql创建的数据库保存在哪里_在MySQL中创建数据库时,我的数据库保存在哪里?...
  8. 汽车品牌查询及车型大全查询
  9. ARM920T及其MMU,Cache学习杂记(一)
  10. 视频会议的进化方向是什么?
  11. python调用word报错,提示“服务器运行失败”,现已解决
  12. 【邱锡鹏-神经网络与深度学习】第一章绪论 知识点汇总
  13. haar adaboost matlab,人脸检测算法之Haar-Adaboost分类器原理
  14. 基于FPGA的图像处理之幂律(伽马校正)变化
  15. 爬虫 使用python+requests模块爬取12306网站的车次信息
  16. 詹姆斯·高斯林-JAVA之父
  17. 利用Python进行王者荣耀壁纸下载
  18. vue里面的ref详解
  19. 海康威视新手上路:MFC连接球机
  20. 杜绝迅雷上传数据的方法

热门文章

  1. MybatisPlus入门之介绍
  2. SpringBoot_数据访问-整合MyBatis(二)-注解版MyBatis
  3. java gridlayout 设置列宽_java 利用GridBagLayout布局时,如何设置单列列宽?
  4. ubuntu中supervisor的安装和学习
  5. JAVA数据类型的转换及数据的原反补三码
  6. JAVA面试题(20)
  7. Vue 动态创建实例
  8. VS2017 installed in a different location
  9. 智能推荐:“相关性搜索”只给你最想要的
  10. 用python写网络爬虫 -从零开始 3 编写ID遍历爬虫