我的理解:把服务器和客户端的交互工程比喻成外来人员访问公司,每来一个客户端访问,需要服务器的前台经理接待此客户,然后前台经理呼叫一个接待员来将客户带上楼。服务器的两个角色前台经理和接待员就是服务器的两个CSocket对象。

1、需要生成两个类对象,一个用来监听客户的访问,一个用来接待客户。

  在类向导中新建类名:CSockL和CSockC,重写CSockL的OnAccept函数和CSockC的OnReceive和OnClose函数:

  CSockL(1)、

    void CSockL::OnAccept(int nErrorCode)//有客户连接,就回调此函数
    {
    // TODO: 在此添加专用代码和/或调用基类
    CSockC *p=new CSockC;//每有一个访问,就生成一个CSockC对象指针
    this->Accept(*p);
    //p->GetPeerName()可以用来获取刚刚连接的客户端ip和端口
    CSocket::OnAccept(nErrorCode);
    }

  CSockC(2)、

    void CSockC::OnReceive(int nErrorCode)//有客户发送消息,就回调
    {
    // TODO: 在此添加专用代码和/或调用基类
    char rcv[100];//装从客户端传来的数据
    int rcvLenth=Receive(rcv,sizeof(rcv));//核心处
    rcv[rcvLenth]=0;//消除乱码
    CString ipAddrss;//装发送消息的客户端ip地址
    UINT ipPort;//装端口
    int result=GetPeerName(ipAddrss,ipPort);//获取发送消息客户端的ip和端口

    CTestCSoketServerDlg *p=(CTestCSoketServerDlg*)AfxGetMainWnd();//获取主窗口类指针
    p->ShowInfo(rcv,ipAddrss,ipPort);//调用主窗口类指针的显示函数
    CSocket::OnReceive(nErrorCode);
    }

    (3)、

    void SocketS::OnClose(int nErrorCode)//有客户端断开连接回调
    {
    // TODO: 在此添加专用代码和/或调用基类

    CSocket::OnClose(nErrorCode);
    }

2、现在已经得到一个我自己定义的类CSockL:CSocket,在Dlg.h中声明一个CSockL的对象,在Dlg.cpp中的打开服务器button中定义

  if(!m_sockl.Create(8080))
  {
  AfxMessageBox(CString("创建套接字失败"));
  return;
  }
  m_sockl.Listen();

  注意:服务器不需要指定ip,指定端口创建套接字之后,就可以用于捕获所有本地客户端活动

  所以直接create之后listen就相当于是服务器了。

  另外使用Create之后不能再使用Bind()函数

3、如果需要从服务器传数据到客户端

  这时所有的客户端都长连接在了服务器上面,在Accept中可以得到这些客户端的ip,所以只要有ip就可以用sendto来发送了。

笔记:

客户端套接字使用Send()函数的时候,是将数据放入TCP系统共有的缓冲区,然后TCP系统在服务器将缓冲区的数据接收,使用的是Receive()函数。在服务器接收的过程中,客户端会一直处于阻塞状态,只有当服务器将缓冲区里面的数据全部接收完了之后,客户端才会开始下一次Send()。

CSocket与线程配合使用:

发送端:使用AfxBeginThread()生成一个新的线程,在这个线程里面Send()数据就行了。这里应该加入一个确认发送标志,即每发送完一个包之后,就进入一个死循环,当服务器处理了这个包的数据后,向客户端发送一个确认包,客户端解析这个包之后,退出死循环,再进行下一个包的处理。

接收端:先把数据全部接收到一个buf里面,注意这个buf应尽可能大一点,否则可能会出现粘包的情况。然后通过判断如果是需要的客户端端口发来数据,就进入AfxBeginThread()线程,在这个线程里面处理数据。处理完了之后,想客户端发送确认包,进行下一次的数据处理。

根据上面的原理,可以实现CSocket+线程传送文件

CSocket服务器(TCP)的更多相关文章

  1. 【故障公告】推荐系统中转站撑爆服务器 TCP 连接引发的故障

    上周五下午,我们在博客中部署了推荐系统,在博文下方显示“最新IT新闻”的地方显示自动推荐的关联博文.我们用的推荐系统是第四范式的推荐服务,我们自己只是搭建了一个推荐系统中转站(基于 ASP.NET C ...

  2. 服务器tcp连接timewait过多优化及详细分析

    [背景说明] 在7层负载均衡上,查询网络状态发现timewait太多,于是开始准备优化事宜 整体的拓扑结构,前面是lvs做dr模式的4层负载均衡,后端使用(nginx.or haproxy)做7层负载 ...

  3. 查看服务器tcp连接及服务器并发

    一.查看哪些IP连接本机netstat -an二.查看TCP连接数1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ...

  4. c--socket通信TCP篇

    https://www.cnblogs.com/ashen/p/4474360.html #include <sys/socket.h> 2 #include <stdlib.h&g ...

  5. 线上服务器TCP被打满是啥情况

    从一个线上服务器警告谈谈backlog https://wangxiangnan.cc/?p=105 缘起 双十一如期而至,此时的我因为在处理客户的一个问题已经陷入了忙碌.突然,不断接到驻场实施发来的 ...

  6. 服务器TCP连接中 TIME_WAIT 状态过多

    今天查看服务器的TCP连接数,发现其中 TIME_WAIT 状态的太多了: # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a ...

  7. [0] 服务器 TCP 提供程序无法在 [ 'any' <ipv4> *] 上侦听。TCP 端口已在使用中。

    配置工具——配置管理器——SQLEXPRESS协议下的TCP/IP协议 将其已启用改为禁用. 同时停止SQLEXPRESS服务即可

  8. zabbix增加服务器tcp监控

     zabbix server web界面,需要导入 tcp 监控模板 操作步骤:     Configuration --> Templates --> Import ,选择 本地的 zb ...

  9. 客户机与服务器TCP连接状态

    客户机:

随机推荐

  1. 什么是XML

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  2. angular form 验证

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 手机端js模拟长按事件(代码仿照jQuery)

    代码编写: $.fn.longPress = function(fn) { var timeout = undefined; var $this = this; for(var i = 0;i< ...

  4. Another app is currently holding the yum lock; waiting for it to exit...另一个应用程序在占用yum lock,等待其退出。

    这种情况下通常是由于yum的时候意外退出造成的,虽然也给出提示当前占用进行的id,但是执行kill -9 3599 强制杀死进程后,情况依然没能改变. 备注:(-9是强制杀死) 主要原因是因为,yum ...

  5. Auto push git tag

    CALL "C:\Program Files\TortoiseGit\bin\pageant.exe" "d:\CKey.ppk" set GIT_SSH=C: ...

  6. equals和==

    在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...

  7. SessionHelper

    MXS&Vincene  ─╄OvЁ  &0000009 ─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好 ...

  8. loadrunner具体实例教你如何进行结果分析

    1.对于吞吐量,单位时间内吞吐量越大,说明服务器的处理能越好,而请求数仅表示客户端向服务器发出的请求数,与吞吐量一般是成正比关系. 2.一般瓶颈应该就是某个因素在不断增加,某个相关性能指标也会不断增加 ...

  9. HTML5 webapp框架

    1.Sencha Touch 注:jQTouch主要用于手机上的web Kit浏览器上实现一些包括动画.列表导航.默认应用样式等各种常见UI效果的 JavaScript 库.支持包括 iPhone.A ...

  10. Nginx防蜘蛛爬虫处理

    假定一个场景:某个网站它可能不希望被网络爬虫抓取,例如测试环境不希望被抓取,以免对用户造成误导,那么需要在该网站中申明,本站不希望被抓取.有如下方法: 方法一:修改nginx.conf,禁止网络爬虫的 ...