VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 321|回复: 0

VC++高级班之网络编程篇-[2]通用Socket函数及CServer类的封装

[复制链接]
01_avatar_middle
online_admins admin 发表于 2018-4-2 23:51:09 | 显示全部楼层 |阅读模式
①、        Socket头文件的包含及库的链接:
  1. #include <WinSock2.h>
  2. #pragma comment(lib, "ws2_32.lib")
复制代码

===================================================
②、        通用函数的封装:
因为客户端和服务器端都能用到,所以就可以放到一个公共的文件中,比如:
  1. Common.cpp 和 Common.h 文件中。
  2. BOOL WinSockInit()
  3. {
  4.         WSADATA wsaData = {0};
  5.         if (WSAStartup(MAKEWORD(2, 2), &wsaData) == NO_ERROR) {
  6.                 return TRUE;
  7.         }else{
  8.                 return FALSE;
  9.         }
  10. }
复制代码

  1. void WinSockUnLoad()
  2. {
  3.         WSACleanup();
  4. }
复制代码


以后还会有一些通用的Socket函数,比如发送数据的函数 SendData,接收数据的函数 RecvData,
这些以后遇到了再给大家封装,以免大家挺的迷糊。
===================================================
③、        CServer类的封装:
为了使用方便,把聊天室服务器端的相关Socket网络操作封装成一个CServer类来管理。
提供一些基本的方法,比如:StartServer、StopServer之类的,期间用到的Socket函数一个一个给大家讲解。
===================================================
④、        相关函数代码:
  1. BOOL CServer::StartServer()
  2. {
  3.         CWinThread *pThread = AfxBeginThread(acceptProc, this);
  4.         if (!pThread){
  5.                 AfxMessageBox(_T("创建监听线程失败!"));
  6.                 return FALSE;
  7.         }
  8.         return TRUE;
  9. }
复制代码

  1. UINT CServer::acceptProc(LPVOID pParam)
  2. {
  3.         CServer *pThis = (CServer *)pParam;

  4.         pThis->m_ListenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  5.         if (pThis->m_ListenSock == INVALID_SOCKET) {
  6.                 AfxMessageBox(_T("创建监听Socket失败!"));
  7.                 return FALSE;
  8.         }
  9.         sockaddr_in sServer = {0};
  10.         sServer.sin_family = AF_INET;
  11.         sServer.sin_addr.s_addr = htonl(INADDR_ANY);
  12.         sServer.sin_port = htons(pThis->m_nPort);
  13.         if (bind(pThis->m_ListenSock, (sockaddr *)&sServer, sizeof(sServer)) == SOCKET_ERROR) {
  14.                 AfxMessageBox(_T("端口绑定失败!"));
  15.                 return FALSE;
  16.         }

  17.         if (listen(pThis->m_ListenSock, SOMAXCONN) == SOCKET_ERROR) {
  18.                 AfxMessageBox(_T("端口监听失败!"));
  19.                 return FALSE;
  20.         }

  21.         sockaddr_in clientAddr = {0};
  22.         int iLen = sizeof(sockaddr_in);
  23.         SOCKET accSock = accept(pThis->m_ListenSock, (sockaddr *)&clientAddr , &iLen);
  24.         if (accSock == INVALID_SOCKET) {
  25.                 continue;
  26.         }
  27.        
  28.         ////其他代码;

  29.         return TRUE;
  30. }
复制代码

===================================================
⑤、        Socket函数讲解:
  1. SOCKET WSAAPI socket(
  2.   _In_  int af, //地址描述
  3.   _In_  int type, //套接字类型
  4.   _In_  int protocol //协议类型
  5. );
复制代码

  1. int bind(
  2.   _In_  SOCKET s, //套接字句柄
  3.   _In_  const struct sockaddr *name, //要关联的本地地址
  4.   _In_  int namelen //地址的长度
  5. );
复制代码

  1. int listen(
  2.   _In_  SOCKET s, //套接字句柄
  3.   _In_  int backlog //监听队列中允许保持的尚未处理的最大连接数量
  4. );
复制代码

  1. SOCKET accept(
  2.   _In_     SOCKET s, //套接字句柄
  3.   _Out_    struct sockaddr *addr, //一个指向 sockaddr_in 结构的指针,用于取得对方的地址信息
  4.   _Inout_  int *addrlen //一个指向地址长度的指针
  5. );
复制代码


===================================================
===================================================

※※※ 小作业: 自己动手编写本节课讲解的Socket代码。
------------------------------------- End -------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
VC驿站Vip会员售后答疑截图【持续更新】:https://www.cctry.com/thread-288054-1-1.html
教程介绍及详情请见:https://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:https://www.cctry.com/static/vip/index.html





上一篇:VC++高级班之网络编程篇-[1]网络编程概述
下一篇:VC++高级班之网络编程篇-[3]CServer类的封装

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-15 04:51

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表