我想在Windows Phone 7.1上准备应用程序,以便在相机和手机(Wanscam相机)之间发送/接收UDP数据报 . 我已经阅读了很多关于此的讨论,现在我不知道它在OS 7.1上是可行的 .

一开始我必须找到相机IP . 我写了一些基于Device Discovery in Windows phone 7的代码:

var ipAddress = IPAddress.Parse(IP_BROADCAST);
var endpoint = new IPEndPoint(ipAddress, portToScan);
byte[] data = packet.GetRawPacketBytes();
var args = new SocketAsyncEventArgs();
args.RemoteEndPoint = endpoint;
args.SetBuffer(data, 0, data.Length);
args.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
    recevingEnabled = true;
    Timer timer = new Timer(TimerCallback, null, 0, 1000);
    while (recevingEnabled)
    {
        Receive(portToScan);
    }
});
bool result = socket.SendToAsync(args);

接收方法:

public void Receive(int portNumber)
{
    SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
    socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNumber);
    socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
    socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
    {
        ...
        clientDone.Set();
    });

    clientDone.Reset();
    socket.ReceiveAsync(socketEventArg);
    clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}

1)当我调用此方法时,我从相机接收数据但我在socketEventArg中找不到发件人IP地址 .
2)当在本地网络连接更多摄像机时,我不能接收更多的数据报 .

下一点对我来说更奇怪 . 根据消息来源,我知道这是可能的:Sockets for Windows Phone .

我的方法看起来像while(true)TryReceiving;但它没有用 . 我决定检查笔记本电脑上的简单python脚本和我的简单WP7应用程序之间的udp通信 . 当我查看结果时,我感到很惊讶 .

我将手机(192.168.1.102)插入笔记本电脑(192.168.1.104)并开始调试 . 接下来我发送了一些数据报到笔记本电脑我的笔记本电脑收到了python脚本中的数据报并转发了消息 . 不幸的是我的手机应用程序不知道问题出在哪里 . 我通过Wireshark嗅探我的网络,我看到我的笔记本电脑转发消息到手机 . 我尝试在每种组合中将 ReceiveAsync 更改为 ReceiveFromAsync 并将 SendToAsync 更改为 SendAsync .

码:

private void ReceiveTask()
{

    byte[] data = currentStunServer.HelloToAddressPacket().GetRawPacketBytes();
    SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
    socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.104"), 32110);
    socketEventArg.SetBuffer(data, 0, data.Length);
    socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
    {
        while (true)
        {
            SocketAsyncEventArgs socketEventArg2 = new SocketAsyncEventArgs();
            socketEventArg2.RemoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.104"), 32110);
            socketEventArg2.SetBuffer(new Byte[2048], 0, 2048);

            socketEventArg2.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s2, SocketAsyncEventArgs e2)
            {
                if (e2.BytesTransferred > 0)
                {
                    string response;
                    response = Encoding.UTF8.GetString(e2.Buffer, e.Offset, e2.BytesTransferred);
                    response = response.Trim('\0');
                }
                clientDone.Set();
            });

            clientDone.Reset();
            UdpSocket2.ReceiveAsync(socketEventArg2);
            clientDone.WaitOne(1000);
        }
    });

    bool result = UdpSocket2.SendToAsync(socketEventArg);

    while (true)
    {
        Receive();
        System.Threading.Thread.Sleep(1000);
    }
}

有没有办法解决这个问题?也许Windows Phone 8提供了一些解决方案?对不起我的英语不好 .