wp7:msdn上的socket类,改写后发现问题,求解决

clovexmu 2011-10-04 02:42:10
客户端的socket类的来源在这里

http://msdn.microsoft.com/zh-cn/library/hh202858(v=VS.92).aspx#Y3648

msdn上的代码只是进行一次客户端的连接、发送、接收数据,然后就断开了,根据需要,我把主页面程序里修改成一次连接、但不马上中断连接,可以持续进行收发数据。类的代码没有修改。然后调试发现,在调用类的receive函数时,偶尔会发生离奇的事情。表现在:有时候接收到数据,触发receive里的完成事件时,明明把接收到的数据放在stirng类型的response 变量里,然后set信号量状态,再跳转到函数最后一行,准备执行 return response时,竟然发现response 为空字符串了!
查了一些资料,发现可能是在完成事件的回调中,发生了线程重入的事,导致了变量response 值被修改了。作为c#,WP初学者,想请教如何解决这个问题,或者有更好地socket类可以解决这个问题吗?
另外,这个“偶尔”的现场在这种情况下会出现。调用receive函数后,服务端没有发送数据,然后执行 _clientDone.WaitOne(TIMEOUT_MILLISECONDS) ,没有触发任何socket完成事件后,因超时而结束阻塞,结束receive函数后,再一次执行receive,这时服务端发送了数据,虽然触发了socket事件,可以接收到数据,但是 return response 时,还是返回空值。

附上SocketClient::receive函数

public string Receive()
{

string response = "";

// We are receiving over an established socket connection
if (_socket != null)
{
// Create SocketAsyncEventArgs context object
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;

// Setup the buffer to receive the data
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);

// Inline event handler for the Completed event.
// Note: This even handler was implemented inline in order to make this method self-contained.
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
// Retrieve the data from the buffer
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
response = response.Trim('\0');

}
else
{
response = e.SocketError.ToString();
}

_clientDone.Set();
});

// Sets the state of the event to nonsignaled, causing threads to block
_clientDone.Reset();

// Make an asynchronous Receive request over the socket
_socket.ReceiveAsync(socketEventArg);

// Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
// If no response comes back within this time then proceed
_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
response = "Socket is not initialized";
}

return response;
}

...全文
422 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
熊华贵 2012-12-11
  • 打赏
  • 举报
回复
我也碰到此问题了。程序到后台之后就会有问题。我联系方式632324893@qq.com大家有谁会的教教我啊。谢谢大牛们
zhaoxingyu2000 2011-10-12
  • 打赏
  • 举报
回复
异步模式下receive是可重入的,所以需尽快将receive到的数据拷贝到预定义的内存块中;或者可采用同步模式进行数据收发。
clovexmu 2011-10-11
  • 打赏
  • 举报
回复
BEYONDMA说的 “可能是SET之后线程没了,内存也被回收产生的问题”,估计是这样子的。
深度克隆不会。。 我直接把最后的string类型的结果赋值到SocketClient的其他变量中,就可以把结果保存起来了。

总之,感觉msdn的这个例子(类)不适合用来做长时间的通讯,存在问题。
terrylove 2011-10-09
  • 打赏
  • 举报
回复
我怎么用的好好的
但是 无法解码H264
freemangood 2011-10-08
  • 打赏
  • 举报
回复
貌似WP7现在的sdk中socket有些问题,我的项目中也碰到类似问题,
模拟器上正常,而在真机上偶尔接收数据不全或接收不到!
zeptolee 2011-10-08
  • 打赏
  • 举报
回复
现在phone7上的socket还是有问题
我们项目上也很头疼。。
terrylove 2011-10-08
  • 打赏
  • 举报
回复
找个silverlight Socket 案例看看
beyondma 2011-10-06
  • 打赏
  • 举报
回复
建议深度克隆后再拷贝,也就是调一下CLONE方法试一下。可能是SET之后线程没了,内存也被回收产生的问题。如果克隆还不行,那你继续回贴说一下现象。
clovexmu 2011-10-05
  • 打赏
  • 举报
回复
顶啊顶。。国庆比较没人气吗
clovexmu 2011-10-04
  • 打赏
  • 举报
回复
想把整个项目文件发上去,貌似csdn还不支持附件是吧? 不太肯定。。

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧