无法在Windows手机中接收Udp

时间:2013-08-27 06:08:03

标签: windows-phone-7 windows-phone-8 windows-phone

我试图将upp数据包从wp7模拟器发送到我的服务器(同一台PC上的java服务器)并获得一些响应。我使用了MSDN中的SocketClient类代码:http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202864(v=vs.105).aspx

在以下情况下完全正常:

  1. 每次我创建Socketclient类的实例并调用send()和receive()方法。
  2. 使用send()发送数据包后,我可以收到几个数据包调用receive()几个。
  3. 但问题是 -

    1. 我创建Socketclient类的实例并调用send()和receive()方法然后再次调用send()和receive()(来自Socketclient类的同一对象)。在这种情况下它可以第二次发送数据包bt无法接收(给出响应“操作超时”)。
    2. 如果我创建一个Socketclient类的新对象以便再次发送和接收它可以工作,但我必须在我的项目中一直使用单个套接字。如何解决这个问题? 这是代码 -

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Net.Sockets;
      using System.Threading;
      using System.Net;
      namespace UdpClient
      {
          class SocketClient
          {
              // Cached Socket object that will be used by each call for the lifetime of this class
              Socket _socket = null;
              // Signaling object used to notify when an asynchronous operation is completed
              static ManualResetEvent _clientDone = new ManualResetEvent(false);
              // Define a timeout in milliseconds for each asynchronous call. If a response is not received within this
              // timeout period, the call is aborted.
              const int TIMEOUT_MILLISECONDS = 5000;
              // The maximum size of the data buffer to use with the asynchronous socket methods
              const int MAX_BUFFER_SIZE = 2048;
              /// <summary>
              /// SocketClient Constructor
              /// </summary>
              public SocketClient()
              {
                  // The following creates a socket with the following properties:
                  // AddressFamily.InterNetwork - the socket will use the IP version 4 addressing scheme to resolve an address
                  // SocketType.Dgram - a socket that supports datagram (message) packets
                  // PrototcolType.Udp - the User Datagram Protocol (UDP)
                  _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
              }
              /// <summary>
              /// Send the given data to the server using the established connection
              /// </summary>
              /// <param name="serverName">The name of the server</param>
              /// <param name="portNumber">The number of the port over which to send the data</param>
              /// <param name="data">The data to send to the server</param>
              /// <returns>The result of the Send request</returns>
              public string Send(string serverName, int portNumber, string data)
              {
                  string response = "Operation Timeout";
                  // We are re-using the _socket object that was initialized in the Connect method
                  if (_socket != null)
                  {
                      // Create SocketAsyncEventArgs context object
                      SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                      // Set properties on context object
                      socketEventArg.RemoteEndPoint = new DnsEndPoint(serverName, portNumber);
                      // Inline event handler for the Completed event.
                      // Note: This event handler was implemented inline in order to make this method self-contained.
                      socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
                      {
                          response = e.SocketError.ToString();
                          // Unblock the UI thread
                          _clientDone.Set();
                      });
                      // Add the data to be sent into the buffer
                      byte[] payload = Encoding.UTF8.GetBytes(data);
                      socketEventArg.SetBuffer(payload, 0, payload.Length);
                      // Sets the state of the event to nonsignaled, causing threads to block
                      _clientDone.Reset();
                      // Make an asynchronous Send request over the socket
                      _socket.SendToAsync(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;
              }
      
      
      
      
              /// <summary>
              /// Receive data from the server
              /// </summary>
              /// <param name="portNumber">The port on which to receive data</param>
              /// <returns>The data received from the server</returns>
              public string Receive(int portNumber)
              {
                  string response = "Operation Timeout";
                  // We are receiving over an established socket connection
                  if (_socket != null)
                  {
                      // Create SocketAsyncEventArgs context object
                      SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                      socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNumber);
                      // 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.ReceiveFromAsync(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;
              }
      
              /// <summary>
              /// Closes the Socket connection and releases all associated resources
              /// </summary>
              public void Close()
              {
                  if (_socket != null)
                  {
                      _socket.Close();
                  }
              }
      
          }
      }
      

1 个答案:

答案 0 :(得分:0)

问题出在接收功能上。数据包数据是异步分配给字符串响应的,但它在完成receiveAsync操作之前从当前线程返回变量响应。