想做一个很简单的小程序,客户端连一下服务器,然后获取想要的信息。若服务器故障不回复不能一直阻塞,但是Wince下设置超时好像不能用,编译没问题,执行就报错。代码如下,
- C# code
Socket DNSClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); DNSClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000);
执行到第2句,就报错:在getsockopt或setsockopt调用中制定了未知、无效或不受支持的选项或级别。
感觉像系统不支持,接触嵌入式不久,哪位知道什么原因、怎么解决,万分感谢!!!
------解决方案--------------------
放到线程里面去执行,超时了kill线程
------解决方案--------------------
超时自己做,用个定时器计算,时间到,则给出超时标志,控制定时器的启动计数
------解决方案--------------------
- VB.NET code
' 我做的 WINCE-SOCKET 超时专用’送你参考,哈哈 Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick '超时专用计时 If TCPClient.LJbutton.Enabled = True Then ljztxs.Text = "未连接" T1TimeOut = 2 'T1进来还有个初始化值,到才执行 jdmlbz = False '没收到数据标志 ModbusWait1 = False Timer2.Enabled = False Exit Sub End If ModbTimeOut = ModbTimeOut + 1 If ModbTimeOut > 2 Then ModbTimeOut = 0 ModbusWait1 = False '停止超时等待 Timer2.Enabled = False ' MessageBox.Show("超时无应答!") ljztxs.Text = "超时" T1TimeOut = 0 'T1进来还有个初始化值,到才执行 jdmlbz = False '没收到数据标志 BeginInvoke(New EventHandler(AddressOf TCPClient.DKbutton_Click)) '用此法点击断开按钮!发空字符会掉线。 End If End Sub
------解决方案--------------------
我们用了,确实不支持超时,用异步的吧,这样超时了自己取消.再重新发送接收.
------解决方案--------------------
设置非阻塞,然后用select
wince socket和桌面系统的api接受的选项有区别,具体的针对你用的api还是查查msdn.