最近开发一个基于WINCE的和另外一个设备进行SOCKET通信的东东。遇到一个问题!
  现在在家,没法传源码,问题是这样的。我开了个单线程对设备进行数据采集。自己写的是客户端。服务端无法修改。
  先试同步方式连接,同步方式获取数据。正常运行2-3分钟,receive(recvBuf)时报SOCKET.SOCKETEXCEPTION,报异常连接被强行关闭,我new了一个socket重新连接,在连接的地方卡住,连接不上。过一阵就出了连接被关闭,
  第二回我采用异步的方式连接,同步方式获取数据。正常运行2-3分钟后报SOCKET.SOCKETEXCEPTION 10054,现有连接被关闭。重新new了个socket进行连接。在BeginReceive处用connectDone做超时判断,再次连接的时候这里老是报超时,无法连接。
  于是乎改异步连接,异步获取数据。还是连接不上。在连接的时候老超时,错误同上。
  然后我将连接改为同步,异步获取数据。这个时候重新new的SOCKET能连接了。不过一到数据获取的时候又报异常,在client.EndReceive(rs)时报出连接被强行关闭,
  异步获取数据时候,我用的是receiveDon.WaitOne(3000,false)做超时判断。在网上查了下资料,貌似SetSocketOption ReceiveTimeOut不支持。
  错误代码全是10054。
  以上代码全未设SetSocketOption,试过DontLinger,好像用处不大,错误依旧,于是放弃了。至于keep-alive好像是需要在服务端上设置,心跳包好像也不成,发上去,设备无响应。
很无语了。有高手看到给点建议吧。
  另外,想了些其它招,比如中止线程,重开新线程连接。只要一报10054,就没办法再次连接了,关闭程序再打开,又能正常连接2-3分钟。试了一天,没啥结果,只能来求助了。socketWinCE多线程asynchronous

解决方案 »

  1.   

    我不确定啊。服务是个设备,人家德国出品,拿来卖钱的,我想应该没啥问题吧。UMG507,只是貌似他给的示例是JAVA的,我把他转成C#了。在我PC机上测试能正常,谁知道一拿到WINCE上就出这毛病。为这我忙了一天,10点才下班儿。
      

  2.   

    最终解决了。问题出在异步发送上,发送时间超时了。改成同步后问题解决。不过还是想再了解清楚下。一旦抛出了10054错误后,怎么再通过异步去连接或发送,老会超时哩?这是BUG还是程序上有问题?知道的的说说看