MFC 网络通讯难题,挑战高手!!!!

时间:2022-09-08 21:50:52
不好意思,我遇到难题,请教各位!
环境:NT服务器环境 C/S模式
编程工具: VC 6
性能要求:
1。高稳定运行(30年*12月*30天*24小时)
2。用MFC封装的类实现(CSocket,CAsyncSocket),不用OnRecive()之类的消息触发,而是主动查询方式。
3。用TCP协议 我以前是用的UDP,在应用层加握手和应答来保障,还是比较稳定的,现想用TCP做,以期更好。

我对在MFC的封装基础上实现TCP的应用不了解(比如CSocket的超时退出机制,等等技术细节)时间很紧,没有时间来一点点摸索,请大家帮帮我!

我想多给分,可惜不能。

17 个解决方案

#1


不用ONRECIVE的话我觉得可以实现一个自己固定大小的缓冲区,每次要读的时候将全部内容读入缓冲区,再从缓冲区中读入其他(如INT,STRING,STREAM等等),当缓冲区读完时候再RECEIVE,这样可能需要两个指针来管理这个缓冲区。DELPHI的INDY就是这样处理的。
其他有些选项稍微设一下,比如服务器中的reuseport,还有keep alive等。

#2


建议:
如果你想追求高稳定性的软件,建议你不要使用windows提供的CSocket或者CAnsynSocket,这些MFC的实现都使用windows消息,所以创建了隐含的窗口,建议你使用IO重载或者完成端口。
使用异步方式完成
—————————————————————————————————
Let your soul guide you upon your way

#3


我不喜欢用MFC封装的类。

直接SOCKET编程好了, 没差多少。
用多线程+SOCKET, 我觉得系统能够比较稳定。
而且系统的可移植性要好些。
说不定那天就可能移到LINUX下了。

#4


数据吞吐量大不大?
客户多不多?

同意rtdb(东临碣石)与barsteng(barsteng)

#5


同意rtdb(东临碣石)与barsteng(barsteng)

MFC封装的socket,只用到socket 1.1标准,有大量连接的话,可能会有消息死锁,效率也很低;建议直接用WinSocket 2.0 API,用异步完成端口或事件驱动模型。

#6


我想用MFC封装的SOCKET类是因为我认为
1。ms 封装的应比我封装的好。
2。有一书说“不用MFC的VC就是没有灵魂的哈姆雷特”
3。项目时间禁,有支持总好一些。
4。最重要的一条:领导要求!!
写写大家的建议!我会在以后的项目中尝试的!

还有要请教大家的:
1。CAsyncSocket 有成员函数支持检测连接是否存在而没有掉线或关闭
  不用OnClose 之类,有一个什末东东来检查?

2. CAsyncSocket.Connet 实际已经成功了,但为什末总是返回0
3。请推荐一本讲MFC网络编程的书,追好精深全面一点。

谢谢大家,在线等待。





#7


有难度,希望大家多回答啊!

#8


你在什么样的操作系统下编程??
对你程序的稳定性可能办不到。。高稳定运行(30年*12月*30天*24小时)
建议你使用linux操作系统来编写。

还有客户端的数量,服务器的运算量等等都要考虑。。

#9


kao,1年启动一次已经很不错了

#10


调用Connect函数,判断返回0时利用GetLastError,如果返回WSAEISCONN,说明原Socket已经联接。

#11


up

#12


建议先把领导给换了!

用MFC的socket封装类来写高性能和高稳定性的网络通讯程序成功的可能性太小了!
如坚持,你这个太空石就会掉到地球上-------------------
---------------------粉身碎骨!!!!!!!!!!!

#13


谢谢 sevencat(七猫) barsteng(barsteng)rtdb(东临碣石)
HelpLearnVC(suny)  flashboy(快活一刀)  uhlan(uhlan)
devil97518(天使也会疯)hi2003(我是小小菜鸟)
的意见。

TO :
barsteng(barsteng)rtdb(东临碣石)
HelpLearnVC(suny)  flashboy(快活一刀)  
hi2003(我是小小菜鸟)

系统的吞吐量不大,只支持3-5个连接,服务器不怕从起,只要能从起后能正长工作,并不丢失数据即可。

TO:uhlan(uhlan)
多谢多谢!

希望大家继续。








uhlan(uhlan)

#14


up

#15


1。CAsyncSocket 有成员函数支持检测连接是否存在而没有掉线或关闭
  不用OnClose 之类,有一个什末东东来检查?

你应该自己处理。
比较容易想到的就是 client 定时发送信息,server没有收到就认为没有连接了。

2. CAsyncSocket.Connet 实际已经成功了,但为什末总是返回0

异步的返回是这样的(搜以前的帖子看看),你调用了 connect 后,就不管了。
在 CAsyncSocket::OnConnect()
{
  if(nErrorCode == 0)
   { 
    //连接上了

   }
}

3。请推荐一本讲MFC网络编程的书,追好精深全面一点。
《windows 网络编程技术》个人感觉还好。

#16


同意TianGo123(农民)的话。
1。发心跳包!
2。同意
3。。。。

#17


谢谢大家
谢谢
sevencat(七猫) barsteng(barsteng)rtdb(东临碣石)  nbb01()


尤其感谢uhlan(uhlan) TianGo123(农民) 

结帖

#1


不用ONRECIVE的话我觉得可以实现一个自己固定大小的缓冲区,每次要读的时候将全部内容读入缓冲区,再从缓冲区中读入其他(如INT,STRING,STREAM等等),当缓冲区读完时候再RECEIVE,这样可能需要两个指针来管理这个缓冲区。DELPHI的INDY就是这样处理的。
其他有些选项稍微设一下,比如服务器中的reuseport,还有keep alive等。

#2


建议:
如果你想追求高稳定性的软件,建议你不要使用windows提供的CSocket或者CAnsynSocket,这些MFC的实现都使用windows消息,所以创建了隐含的窗口,建议你使用IO重载或者完成端口。
使用异步方式完成
—————————————————————————————————
Let your soul guide you upon your way

#3


我不喜欢用MFC封装的类。

直接SOCKET编程好了, 没差多少。
用多线程+SOCKET, 我觉得系统能够比较稳定。
而且系统的可移植性要好些。
说不定那天就可能移到LINUX下了。

#4


数据吞吐量大不大?
客户多不多?

同意rtdb(东临碣石)与barsteng(barsteng)

#5


同意rtdb(东临碣石)与barsteng(barsteng)

MFC封装的socket,只用到socket 1.1标准,有大量连接的话,可能会有消息死锁,效率也很低;建议直接用WinSocket 2.0 API,用异步完成端口或事件驱动模型。

#6


我想用MFC封装的SOCKET类是因为我认为
1。ms 封装的应比我封装的好。
2。有一书说“不用MFC的VC就是没有灵魂的哈姆雷特”
3。项目时间禁,有支持总好一些。
4。最重要的一条:领导要求!!
写写大家的建议!我会在以后的项目中尝试的!

还有要请教大家的:
1。CAsyncSocket 有成员函数支持检测连接是否存在而没有掉线或关闭
  不用OnClose 之类,有一个什末东东来检查?

2. CAsyncSocket.Connet 实际已经成功了,但为什末总是返回0
3。请推荐一本讲MFC网络编程的书,追好精深全面一点。

谢谢大家,在线等待。





#7


有难度,希望大家多回答啊!

#8


你在什么样的操作系统下编程??
对你程序的稳定性可能办不到。。高稳定运行(30年*12月*30天*24小时)
建议你使用linux操作系统来编写。

还有客户端的数量,服务器的运算量等等都要考虑。。

#9


kao,1年启动一次已经很不错了

#10


调用Connect函数,判断返回0时利用GetLastError,如果返回WSAEISCONN,说明原Socket已经联接。

#11


up

#12


建议先把领导给换了!

用MFC的socket封装类来写高性能和高稳定性的网络通讯程序成功的可能性太小了!
如坚持,你这个太空石就会掉到地球上-------------------
---------------------粉身碎骨!!!!!!!!!!!

#13


谢谢 sevencat(七猫) barsteng(barsteng)rtdb(东临碣石)
HelpLearnVC(suny)  flashboy(快活一刀)  uhlan(uhlan)
devil97518(天使也会疯)hi2003(我是小小菜鸟)
的意见。

TO :
barsteng(barsteng)rtdb(东临碣石)
HelpLearnVC(suny)  flashboy(快活一刀)  
hi2003(我是小小菜鸟)

系统的吞吐量不大,只支持3-5个连接,服务器不怕从起,只要能从起后能正长工作,并不丢失数据即可。

TO:uhlan(uhlan)
多谢多谢!

希望大家继续。








uhlan(uhlan)

#14


up

#15


1。CAsyncSocket 有成员函数支持检测连接是否存在而没有掉线或关闭
  不用OnClose 之类,有一个什末东东来检查?

你应该自己处理。
比较容易想到的就是 client 定时发送信息,server没有收到就认为没有连接了。

2. CAsyncSocket.Connet 实际已经成功了,但为什末总是返回0

异步的返回是这样的(搜以前的帖子看看),你调用了 connect 后,就不管了。
在 CAsyncSocket::OnConnect()
{
  if(nErrorCode == 0)
   { 
    //连接上了

   }
}

3。请推荐一本讲MFC网络编程的书,追好精深全面一点。
《windows 网络编程技术》个人感觉还好。

#16


同意TianGo123(农民)的话。
1。发心跳包!
2。同意
3。。。。

#17


谢谢大家
谢谢
sevencat(七猫) barsteng(barsteng)rtdb(东临碣石)  nbb01()


尤其感谢uhlan(uhlan) TianGo123(农民) 

结帖