当前位置:编程学习 > wap >>

WP7 Mango 的Socket问题,难道是BUG?

是这样的。我先用Socket向一个WEB服务器发送请求,然后再接收WEB服务器返回的内容。但是却出现了一个很奇怪的Bug,令我好长时间没有解决。
在手机里运行,用Visual Studio调试来看,接收服务器返回的信息不全。虽然我把缓冲区定义了16KB,但是实际接收的字节数仅为1460。但是,如果程序在模拟器中运行,就一切正常。
更奇怪的是,我在ReceiveAsync方法调用前,强行用ManualResetEvent让线程挂起几秒钟,在手机里运行就是正常的。
我现在不明白这是WP7 Silverlight的一个Bug还是我程序的Bug --------------------编程问答-------------------- TCP粘包,真机网速卡吗 --------------------编程问答-------------------- 手机连数据线用的电脑上的网络,应该是没问题的 --------------------编程问答--------------------
引用 1 楼 drsmart 的回复:
TCP粘包,真机网速卡吗

手机通过连数据线用的电脑上的网络,应该是没问题的 --------------------编程问答--------------------
引用 1 楼 drsmart 的回复:
TCP粘包,真机网速卡吗

手机用数据线连电脑用的电脑网络,应该是没问题的吧 --------------------编程问答-------------------- 贴代码吧,wp7的socket部分比较简单,好处理的 --------------------编程问答--------------------
引用 5 楼 drsmart 的回复:
贴代码吧,wp7的socket部分比较简单,好处理的


原来的程序比较复杂,我刚才专门写了一个简单的,问题依旧

void Start()
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.NoDelay = true;
            SocketAsyncEventArgs args = new SocketAsyncEventArgs();
            args.RemoteEndPoint = new DnsEndPoint("news.baidu.com", 80);
            args.Completed += new EventHandler<SocketAsyncEventArgs>(SocketCallback);
            socket.ConnectAsync(args);
        }

        void SocketCallback(object sender, SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success)
            {
                Dispatcher.BeginInvoke(() => MessageBox.Show("出错了!"));
                e.ConnectSocket.Close();
                return;
            }
            switch (e.LastOperation)
            {
                case SocketAsyncOperation.Connect:
                    string sendStr = "GET / HTTP/1.1\nHOST: news.baidu.com\nConnection: Keep-Alive\n\n";
                    byte[] sendData = Encoding.UTF8.GetBytes(sendStr);
                    e.SetBuffer(sendData, 0, sendData.Length);
                    e.ConnectSocket.SendAsync(e);
                    break;
                case SocketAsyncOperation.Send:
                    byte[] recvData = new byte[1024 * 16];
                    e.SetBuffer(recvData, 0, recvData.Length);
                    e.ConnectSocket.ReceiveAsync(e);
                    break;
                case SocketAsyncOperation.Receive:
                    string recvStr = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                    Dispatcher.BeginInvoke(()=>MessageBox.Show("收到" + e.BytesTransferred + "字节。"));
                    break;

            }

        }

在MainPage.xaml.cs里,单击按钮调用Start方法。
如果在模拟器运行,会弹出对话框接收到1万6千多字节,但是在手机运行(固件版本8107),只能收到1500-1600个字节。但是如果在e.ConnectSocket.ReceiveAsync(e);这句加个断点,运行到这个断点后再让它继续运行,就会收到1万多字节,或者在这句前面人工让线程挂起几秒钟也行。 --------------------编程问答--------------------
引用 5 楼 drsmart 的回复:
贴代码吧,wp7的socket部分比较简单,好处理的

我才刚接触WP7的编程,很多问题没有整明白。能否留下您的联系方式? --------------------编程问答-------------------- 确实是粘包引起的,谢谢DrSmart的指点,让我找到了解决方法 --------------------编程问答--------------------
引用 8 楼  的回复:
确实是粘包引起的,谢谢DrSmart的指点,让我找到了解决方法

想问下你那边怎么解决的呢? 我这边也是,模拟器正常,手机一接收就只有部分信息 --------------------编程问答--------------------
引用 5 楼  的回复:
贴代码吧,wp7的socket部分比较简单,好处理的

请教下,我这边跟楼上的一样问题,您那边怎么解决的? 谢谢
补充:移动开发 ,  Windows Phone
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,