Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NETCF异步TCP套接字关闭问题_C#_Compact Framework_Activesync_Asyncsocket - Fatal编程技术网

C# .NETCF异步TCP套接字关闭问题

C# .NETCF异步TCP套接字关闭问题,c#,compact-framework,activesync,asyncsocket,C#,Compact Framework,Activesync,Asyncsocket,我有一个TCP客户端/服务器应用程序,可以通过ActiveSync连接与Windows CE设备通信。客户端和服务器都使用异步套接字(即Socket.Begin*和Socket.End*函数)。当客户端和服务器都在我的桌面上运行时,所有功能都完全按照预期运行,但当客户端在通过ActiveSync连接的Windows CE设备上运行时,我总是在调用Socket.Shutdown(当设备启动断开连接时)后在ReceiveCallback上收到SocketException。完全例外的情况是: Sys

我有一个TCP客户端/服务器应用程序,可以通过ActiveSync连接与Windows CE设备通信。客户端和服务器都使用异步套接字(即
Socket.Begin*
Socket.End*
函数)。当客户端和服务器都在我的桌面上运行时,所有功能都完全按照预期运行,但当客户端在通过ActiveSync连接的Windows CE设备上运行时,我总是在调用
Socket.Shutdown
(当设备启动断开连接时)后在ReceiveCallback上收到
SocketException
。完全例外的情况是:

System.Net.Sockets.SocketException: An error message cannot be displayed because an optional resource assembly containing it cannot be found
at System.Net.Sockets.Socket.ReceiveNoCheck()
at ReceiveAsyncRequest.doRequest()
at AsyncRequest.handleRequest()
at WorkerThread.doWork()
at WorkerThread.doWorkI()
at WorkItem.doWork()
at System.Threading.Timer.ring()
如果服务器(在桌面上运行)启动断开连接,那么一切似乎都正常工作。关于如何避免这种情况,我有一些想法,包括禁止设备启动的断开连接,以及在启动断开连接后忽略所有异常。然而,我想知道为什么会发生这种情况,以及是否有更好的处理方法

Disconnect和ReceiveCallbacks(在服务器和客户端上操作相同)是:

public bool Disconnect(StateObject状态)
{
试一试{
if(state.isDisconnecting)返回false;
state.isDisconnecting=true;
state.sock.Shutdown(SocketShutdown.Both);
//等待发送和接收完成,但不要等待超过10秒
对于(int i=0;i 0){
//开始侦听下一条消息
state.sock.BeginReceive(state.recvBuffer,0,StateObject.BUFFER_SIZE,SocketFlags.None,新异步回调(ReceiveCallback),state);
}否则{
state.isReceiving=false;
断开(状态);
}
}捕获(例外e){
/*记录异常*/
}
}
//作为参考,StateObject看起来有点像:
公共类状态对象
{
public const int BUFFER_SIZE=1024;
公共套接字sock=null;
公共布尔isSending=false;
公共bool isReceiving=false;
公共bool isDisconnecting=false;
公共字节[]recvBuffer=新字节[缓冲区大小];
公共字节[]发送缓冲区=新字节[缓冲区大小];
//其他有助于处理缓冲区并确保完整消息的东西,
//即使TCP分解数据包。
}

如果您的设备上没有显示消息,因为您的设备上没有安装该消息,那么为了获取实际的异常,您可以尝试确定它需要哪个库并部署它?

。您必须安装netcf.messages.cab。你可以在这里找到它:

C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\Diagnostics

安装此CAB文件后,再次运行应用程序并发布新的错误

永远不要假设CF和完整框架的行为相同@ctacke,是的,我真的开始明白了,虽然很痛苦…你在调试时遇到异常了吗?(是否有WinCE的远程调试器?)是否还有更详细的InnerException?
C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\Diagnostics