2012-12-12 31 views
2

我有一个运行在Windows桌面上的服务器软件,并以.net开发,它始终通过TCP/IP监听套接字上的传入连接。检查套接字是否连接在一个紧凑的框架中

然后我有CE 6.0上运行的客户端软件与Compact Framework的3.5开发...这个客户需要:

  • 连接到服务时启用
  • 发送数据的几个字节的每一个服务器300毫秒
  • 决不在发送挂起或丢失时,每次连接
  • 检查套接字连接

到目前为止,我实现了服务器端基于此样本的异步代码,但修改,以保持连接的生命,直到服务器关闭它们......不仅为一杆,它的工作完美

http://msdn.microsoft.com/en-us/library/fx6588te.aspx

然后我实现客户端这样:

dim clientSocket as new System.Net.Sockets.TcpClient() 

/... code .../ 

'Activate the service 
clientSocket.Connect("10.0.0.34", myPort) 

/.... code ..../ 

'Data send function 
dim serverStream as NetworkStream = clientSocket.GetStream() 
dim outStream as byte() = System.Text.Enconding.ASCII.GetBytes("My messagge...") 
serverStream.Write(outStream, 0, outStream.Length) 
serverStream.Flush 

这也是完美的工作。我需要什么?

  1. 要检测与插座的连接开放之前发送数据...这将避免在一些情况下,时间上的损失了问题

我在网上搜索中,但我不能这样做的方式在CF中执行...而.connected方法在此处不可用。

最好的 - 但它似乎对我来说很愚蠢 - 我发现的方式是当连接/发送成功时设置一个标志,并在发生错误时重置它。

+0

仅供参考,NetworkStream不会缓存写入,因此Flush不会为您执行任何操作。详情请看这里:http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.flush(v=vs.90).aspx – tcarvin

回答

0

我曾经尝试过轮询我的套接字以确定它们是否仍然连接。但根据我的经验,确定套接字是否已关闭的唯一可靠的,与设备无关的方式是发送操作成功或超时。 (注意:你可能想自己检查超时,如果我记得没有,标准的TCP套接字会在20秒后超时,但在这之前我看到过一些非标准的TCP套接字只是不想超时几分钟。)如果你很幸运,那么你在通过套接字实现的协议中有“ping”机制,这样你就可以不时在网络上运行一些无意义的数据,只是看看你是否还有连接。我知道,它可能造成相当的开销,但如果您确实需要知道,这是绝对适用于所有设备的唯一方法。