4

サーバーが「デバッグ」を受信したときに、クライアントにデータを送り返そうとしています。以下のATMは、このエラーを提供します。

ソケットが接続されておらず、(sendto呼び出しを使用してデータグラムソケットで送信する場合)アドレスが指定されていないため、データの送受信要求は許可されませんでした。

質問に答えるのに役立つメインクラスを追加しました

    static Socket newSocket;
    static byte[] data;
    static EndPoint tmpRemote;
    static IPEndPoint sender, endpoint;
    static int recv;
    static void Main(string[] args)
    {
        data = new byte[1024];

        endpoint = new IPEndPoint(IPAddress.Any, 3000);

        newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        newSocket.Bind(endpoint);



        sender = new IPEndPoint(IPAddress.Any, 904);
        tmpRemote = (EndPoint)sender;

        newSocket.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote, new AsyncCallback(OperatorCallBack), data);

        Console.Read();
    }



    private static void OperatorCallBack(IAsyncResult ar)
    {
        log("[" + DateTime.Now + "][New Connection] " + tmpRemote.ToString() + "");
        try
        {
            int size = newSocket.EndReceiveFrom(ar, ref tmpRemote);
            if (size > 0)
            {
                data = (byte[])ar.AsyncState;
                string[] dataCommand = Encoding.ASCII.GetString(data, 0, size).Split(' ');
                if (dataCommand[0] == "debug")
                {
                    newSocket.Send(Encoding.ASCII.GetBytes("HA IT WORKED :)"));
                    log("Sent debug");
                }
                else
                {
                    log("Invalid Command");
                }
            }
            data = new byte[1024];
            newSocket.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote, new AsyncCallback(OperatorCallBack), data);
        }
        catch (Exception exp)
        {
            Console.WriteLine(exp.Message);
        }
    }
4

3 に答える 3

3

遅い接続でソケットに接続しようとすると、同様の問題が発生しました。Send/Receive 呼び出しの前に newSocket.Connected プロパティが true であることを確認して解決しました。

于 2013-08-26T21:58:27.177 に答える
2

エラーメッセージは非常に明確です。接続されていないソケットで、ターゲット アドレスを指定せずに send() を呼び出しています。どこに送っていますか?UDPは知りません。

于 2013-02-18T17:24:07.713 に答える
2

ProtocolType.Udp 経由でデータを送信する場合、connection(socket.connect()) は必要ないため、UDP メッセージが転送されるアドレスを提案しないとエラーが発生する可能性があります

あなたのケース では、アドレスは udp Send() に提供されていません

解決

代わりに SendTo() を試してください

Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
soc.EnableBroadcast = true;
IPEndPoint ipend = new IPEndPoint(IPAddress.Broadcast, 58717);
EndPoint endp = (EndPoint)ipend;
byte[] bytes = new byte[1024];

bytes = Encoding.ASCII.GetBytes(str);

soc.SendTo(bytes,ipend);

soc.Close();
于 2016-05-18T14:17:46.960 に答える