0

C++ で記述されたサーバーと C# で記述されたクライアントがあります。クライアントはそのパケットをサーバーに送信し、サーバーはそれを受信して​​から返送します。残念ながら、サーバーがメッセージを送り返す場合を除いて、すべてが機能します。簡単なコードは次のとおりです。

// サーバー

    if ((recv_len = recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *) &si_sender, &si_senderSize)) == -1)
    {
        die("recvfrom()", s);
    }

    //print details of the client/peer and the data received
    printf("Received packet from %s:%d\n", inet_ntoa(si_sender.sin_addr), ntohs(si_sender.sin_port));

    std::cout << "Data: " << buf << std::endl;

    //now reply the client with the same data information

    if (sendto(s, buf, sizeof(buf), 0, (struct sockaddr*) &si_sender, si_senderSize) == -1)
    {
        die("sendto()", s);
    }

 //cleanup here

//クライアント

    private void btnSearch_Click(object sender, EventArgs e)
    {
        bool found = false;
        byte[] text_to_send = Encoding.ASCII.GetBytes("networkinfo");
        client.Send(text_to_send, text_to_send.Length);

        IPEndPoint serverResponse = new IPEndPoint(IPAddress.Any, 0);

        while (!found)
        {
            if (client.Available > 0)
            {
                byte[] responseBuffer = client.Receive(ref serverResponse);
                string response = Encoding.ASCII.GetString(responseBuffer);
                writeIPAddress(serverResponse.Address.ToString(), serverResponse.Port.ToString());
                found = true;
            }
        }

サーバーは sendto() 関数で失敗しませんが、ネットワーク上で受信する情報を検出していないため、クライアントの while ループは永久にポーリングしますが、sendto() 関数はエラーを返しませんでしたか?

ネットワークデータがどこにあるかについてのアイデアはありますか??

4

1 に答える 1

0

わかりました、最終的にそれを理解しました。他の人がこの頭痛の種にならないように、問題の解決策を投稿したいと思います。

問題は、UDPClient を使用して UDP パケットをブロードキャストすることでした。パケットをブロードキャストした後、同じ UDPClient オブジェクトで受信することはできません (ipaddress.broadcast または "255.255.255.255" を使用)。私が遭遇した解決策は、このオブジェクトをすぐに閉じ、同じポートで別のオブジェクトを開き、その新しいオブジェクトを使用して応答を受信することでした。

//setup broadcast client
broadcastClient = new UdpClient(5454);
broadcastAddress = new IPEndPoint(IPAddress.Broadcast, 8888);
broadcastClient.Connect(broadcastAddress);

//send and immediately close
byte[] text_to_send = Encoding.ASCII.GetBytes("networkinfo");
broadcastClient.Send(text_to_send, text_to_send.Length);
broadcastClient.Close();

//open up new client to receive
UdpClient receivingClient = new UdpClient(5454);
IPEndPoint serverResponse = new IPEndPoint(IPAddress.Any, 0);
byte[] message = receivingClient.Receive(ref serverResponse);
string messageReceived = Encoding.ASCII.GetString(message);

Debug.WriteLine(messageReceived);

MSDN でこの癖 (問題?) について何も見ていないので、これがバグなのか、それとも意図したものであり、文書化されていないだけなのかはわかりません。

于 2013-05-24T21:36:20.667 に答える