判断服务器与客户端是否连通

品茶识书香 2010-05-04 11:41:37
现在我是做服务器端,客户端的情况不属于我来做,公司只要求用winsock1.1版的。想问下如何判断两端是否是连通的?我现在用的是send发送给客户端,来查看返回值,来判断是否还处在连通状态,想问下,除了用SEND的方法,还可以用什么?客户端的处理情况我不太清楚,所以我怕发送send会造成一定的问题,我之前用过select来判断是否有客户请求,可是效果不是很明显,在我监视select第三个参数的时候,总是成功。。这样轮循下去非常占CPU资源一下升到60%之上,想问下达人们还有什么办法来判断两端是否连通。谢谢各位了,我也是刚刚接触通讯这块,请达人们帮帮我
...全文
529 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
【天运子】 2010-05-05
  • 打赏
  • 举报
回复
Accept不可以吗?

if(m_psockServer->Accept(*m_psockClient[msgcount]))
{
//初始化套接字pSocket
//pSocket->Init();
m_psockClient[msgcount]->Init();
AfxMessageBox("Server 连接成功");
}
向立天 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 kerneltea 的回复:]
能给我举个包头包尾的例子吗??

struct head
{
int version;
int size;
};

上面这个算包头吗?
[/Quote]


一般的包头就这样
固定长度
标记包长
品茶识书香 2010-05-05
  • 打赏
  • 举报
回复
能给我举个包头包尾的例子吗??

struct head
{
int version;
int size;
};

上面这个算包头吗?
Kevin_Perkins 2010-05-05
  • 打赏
  • 举报
回复
判断是否处于联通状态,心跳包是很通用也很实用的办法。一般是隔一个固定的时间发出一个心跳,累计检测心跳,若超过一定限度,才判断断开,断开前,也要发送出断开命令。在你的协议中可以添加这样的字段,分别代表不同意思,设计好消息头,消息尾,中间附带消息数据,这样双方都方便解析。
天山游龙 2010-05-05
  • 打赏
  • 举报
回复
你只能控制服务端,是很难通知客户端特殊的消息的。基于流的数据一般都要加包头和包体,包头(包体的数据类型+长度(加密协议)+检验等),包体才是真正的数据类容

品茶识书香 2010-05-04
  • 打赏
  • 举报
回复
心跳包就说,我发个请求,他回发给我一个回复是吗?
tanwei1002 2010-05-04
  • 打赏
  • 举报
回复
跟做客户端的同事协调 发心跳包
品茶识书香 2010-05-04
  • 打赏
  • 举报
回复
好的,明天麻烦你了
向立天 2010-05-04
  • 打赏
  • 举报
回复
我说的紧位和#pragma pack(push,1)没关系
你还是没有理解通信协议是什么
查查相关资料吧
今天太晚了
明天上班有时间的话我看看加你一下
品茶识书香 2010-05-04
  • 打赏
  • 举报
回复
那应该怎么样把结构串行化呢?

我在结构前面加上这个,改成紧位的
#pragma pack(push,1)

还有那个包头包尾,能方便说个例子吗?

xianglitian 方便加下我好友吗。 100161026

有几块不明白的想问问。。
向立天 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 kerneltea 的回复:]
可是结构怎么发送的呢?是不是还要把他序列化成字节流?大概要怎么做?
[/Quote]

你真提醒我了
你这个结构不是紧位的
也就是说
应该进行串行化
而且你这个结构也不叫协议
一般的数据协议需要有包头、包尾
这样接收方才能获得完整数据包
你最好和接收方协商一下
然后制定一个通信协议
品茶识书香 2010-05-04
  • 打赏
  • 举报
回复
可是结构怎么发送的呢?是不是还要把他序列化成字节流?大概要怎么做?
yidasoft 2010-05-04
  • 打赏
  • 举报
回复
我也在用,共同学习!
向立天 2010-05-04
  • 打赏
  • 举报
回复
你的数据包就是一个_TcpPayload
你一次发一个_TcpPayload就好了
对方肯定也是一个_TcpPayload一个_TcpPayload解析的
品茶识书香 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xianglitian 的回复:]

引用 16 楼 kerneltea 的回复:
应该是吧。。。也就那个指针不是。。。其它应该都是,转换成BIT应该都是那样,不过我不知道这样发有没有问题。

有协议
发的时候就按协议填包发就是了
收的人自然会按协议把数据包解析出来
[/Quote]

填包发,就是一个一个按协议字段的顺序发出去是吗?比如说一个4位的数据,我应该怎么发?
比如低四位是代表版本号 比如0x01 代表版本1,我就填个1.发出去吗?
Eleven 2010-05-04
  • 打赏
  • 举报
回复
CSDN上有个例子程序,lz可以参考:http://download.csdn.net/source/1916582
向立天 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 kerneltea 的回复:]
应该是吧。。。也就那个指针不是。。。其它应该都是,转换成BIT应该都是那样,不过我不知道这样发有没有问题。
[/Quote]
有协议
发的时候就按协议填包发就是了
收的人自然会按协议把数据包解析出来
品茶识书香 2010-05-04
  • 打赏
  • 举报
回复
应该是吧。。。也就那个指针不是。。。其它应该都是,转换成BIT应该都是那样,不过我不知道这样发有没有问题。
huanlanshikong 2010-05-04
  • 打赏
  • 举报
回复
结构体作为sizeof的参数应该不是得到它所有字符的长度吧
send的应该就是个字符串,把结构体的各个字符拼成一个字符串再发送不知道可以不

品茶识书香 2010-05-04
  • 打赏
  • 举报
回复
比如说我有一个协议是这样的


typedef struct _TcpPayload
{
char Version : 4 ; //消息的版本,0x0为1.0版本。
char MessageType : 4 ; //消息类型:
char NameLength ; //配置文件名长度
char *Name ; //配置文件名
char DataTypeHigh : 4 ; //报警类型
char DataTypeLow : 4 ; //报警类型
USHORT DataLength;
}TcpPayload;



这是我们的协议要求的的字段,我给他弄成结构的形式了,问下,这样可以吗?如果可以结构体是怎么发送的?
是直接声明一个

TcpPayload test;
char *buf = new char[sizeof(test)] ;
memset(buf,0,sizeof(test));
memcpy(buf,&test,sizeof(test));
send(sockObject,buf,sizeof(test),0);


这样发的过去吗?

还是一个字段一个字段的发送?

实在不好意思,给了那么点分,还问那么多问题。。我在追加点分看看。。麻烦高手们帮帮忙。这个项目挺急的。谢谢各位了
加载更多回复(11)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧