当前位置: 代码迷 >> WinCE >> socket接收超时,该如何处理
  详细解决方案

socket接收超时,该如何处理

热度:452   发布时间:2016-04-28 13:54:49.0
socket接收超时
想做一个很简单的小程序,客户端连一下服务器,然后获取想要的信息。若服务器故障不回复不能一直阻塞,但是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.
  相关解决方案