0

これがクライアント用の私のコードです

    class Program
{
    static void Main(string[] args)
    {
        string msg;
        Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 999);
        sck.Bind(ep);
        byte[] msgbytes;

        while (true)
        {
            msg = Console.ReadLine();
            msgbytes = ASCIIEncoding.ASCII.GetBytes(msg);
            sck.BeginSendTo(msgbytes, 0, msgbytes.Length, SocketFlags.None, ep, null, sck);
            Console.WriteLine("sent");
        }
    }

    void callBack(IAsyncResult result)
    {
        ((Socket)result.AsyncState).EndSendTo(result);
    }
}

}

これがサーバーコードです

    class Program
{
    static void Main(string[] args)
    {
        string msg;
        Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint ep = new IPEndPoint(IPAddress.Any, 999);
        sck.Bind(ep);
        byte[] msgbytes = new byte[100];

        EndPoint client = (EndPoint)ep;

        int bytesrec;
        while (true)
        {
            bytesrec = sck.ReceiveFrom(msgbytes, 0, msgbytes.Length, SocketFlags.None, ref client);
            msg = ASCIIEncoding.ASCII.GetString(msgbytes);
            Console.WriteLine("4");
        }
    }
}

}

問題は、クライアントと一緒に送信しようとすると、サーバーがパケットを受信しないことです。「4」は書き込まれません。これは、sck.receivefromが実行されたことを確認します。

4

2 に答える 2

1

クライアントコードで次のように変更します。sck.Bind(ep);使用するsck.Connect(ep); 代わりに、

sck.BeginSendTo(msgbytes, 0, msgbytes.Length, SocketFlags.None, ep, null, sck);

使用する

sck.Send(msgbytes, msgbytes.Length, SocketFlags.None);

そしてそれはうまくいくはずです...

編集:本当に非同期送信を使用する必要がある場合...次のようなことができます:

IAsyncResult asyncres = sck.BeginSendTo(msgbytes, 0, msgbytes.Length, SocketFlags.None, ep, null, sck);
sck.EndSendTo(asyncres);
于 2012-09-23T10:03:54.227 に答える
-2

サーバーは0.0.0.0でリッスンする必要があります。そうしないと、プラットフォーム依存の領域に入ります。また、クライアントは127.0.0.1だけでなく外部IPアドレスにバインドする必要があります。そうしないと、ローカルホストからパケットを送信する方法がありません。

于 2012-09-23T10:19:40.930 に答える