CSocket服务器(TCP)
我的理解:把服务器和客户端的交互工程比喻成外来人员访问公司,每来一个客户端访问,需要服务器的前台经理接待此客户,然后前台经理呼叫一个接待员来将客户带上楼。服务器的两个角色前台经理和接待员就是服务器的两个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)的更多相关文章
- 【故障公告】推荐系统中转站撑爆服务器 TCP 连接引发的故障
上周五下午,我们在博客中部署了推荐系统,在博文下方显示“最新IT新闻”的地方显示自动推荐的关联博文.我们用的推荐系统是第四范式的推荐服务,我们自己只是搭建了一个推荐系统中转站(基于 ASP.NET C ...
- 服务器tcp连接timewait过多优化及详细分析
[背景说明] 在7层负载均衡上,查询网络状态发现timewait太多,于是开始准备优化事宜 整体的拓扑结构,前面是lvs做dr模式的4层负载均衡,后端使用(nginx.or haproxy)做7层负载 ...
- 查看服务器tcp连接及服务器并发
一.查看哪些IP连接本机netstat -an二.查看TCP连接数1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ...
- c--socket通信TCP篇
https://www.cnblogs.com/ashen/p/4474360.html #include <sys/socket.h> 2 #include <stdlib.h&g ...
- 线上服务器TCP被打满是啥情况
从一个线上服务器警告谈谈backlog https://wangxiangnan.cc/?p=105 缘起 双十一如期而至,此时的我因为在处理客户的一个问题已经陷入了忙碌.突然,不断接到驻场实施发来的 ...
- 服务器TCP连接中 TIME_WAIT 状态过多
今天查看服务器的TCP连接数,发现其中 TIME_WAIT 状态的太多了: # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a ...
- [0] 服务器 TCP 提供程序无法在 [ 'any' <ipv4> *] 上侦听。TCP 端口已在使用中。
配置工具——配置管理器——SQLEXPRESS协议下的TCP/IP协议 将其已启用改为禁用. 同时停止SQLEXPRESS服务即可
- zabbix增加服务器tcp监控
zabbix server web界面,需要导入 tcp 监控模板 操作步骤: Configuration --> Templates --> Import ,选择 本地的 zb ...
- 客户机与服务器TCP连接状态
客户机:
随机推荐
- 2013年各大小IT公司待遇
2013年各大小IT公司待遇(初版 摘自好网)本人西电硕士,根据今年找工作的情况以及身边同学的汇总,总结各大公司的待遇如下,吐血奉献给各位学弟学妹,公司比较全,你想去的公司不在这里面,基本上是无名 ...
- xsd与xsl文件的区别
请问xsd与xsl文件的区别在哪里呢? 我刚学xml,一开始用xmlspy学的,然后生成了一个xsd的文件,但在网上下的源程序是有一个xsl文件的,很不明之间有什么区别的,为什么别人的程序不用xs ...
- android 修改系统的dialog样式
android 修改系统的dialog样式 一.觉得自定义配置文件麻烦?那就来修改系统自定义XML文件来实现修改系统dialog的样式吧. 如果是在XML中样式:首先来说下样式. 在 Style.x ...
- 3D语音天气球(源码分享)——完结篇
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 由于这篇文章是本系列最后一篇,有必要进行简单的回顾和思路整理. 这个程序是由两 ...
- 在linux中搭建git服务器
个人觉得, 以下搭建git服务器的过程就像是在linux增加了一个用户, 而这个用户的登录shell是 git-shell, 太刨根问底的东西我也说不清楚, 还是看下面的过程吧. 过程参考了网上的文章 ...
- 导出excel部分代码
public static function header_file($doc,$file,$title,$type='Excel5'){ if(!empty($doc)){ $objWriter = ...
- (一)MapReduce篇之InputFormat,InputSplit,RecordReader(转)
平时我们写MapReduce程序的时候,在设置输入格式的时候,总会调用形如job.setInputFormatClass(KeyValueTextInputFormat.class);来保证输入文件按 ...
- FreeOnTerminate 的线程在线程管理类的Destroy释放时手工释放的问题
这个问题折腾了我整整一天. 有一个线程管理类,集中管理所有新建的线程, 线程统一在创建时标识 FreeOnTerminate 为 True. 因为有的线程是不限次循环的,所以在管理类最后 Destro ...
- V4L2应用程序框架-二【转】
本文转载自:http://blog.csdn.net/tommy_wxie/article/details/11371439 V4L2驱动框架 主设备号: 81 次设备号: 0-63 64 ...
- Java中类方法与实例方法的区别
实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,但类方法不能访问实例变量.实例方法必须由实例对象来调用,而类方法除了可由实例对象调用外,还可以由类名直接调用. 另外,在类方法中不能使 ...