سؤال

لقد بدأت في القيام ببعض برمجة الشبكات الأساسية.

لقد قرأت/كتبت برامجي الخاصة باستخدام TcpClient و TcpListener وقد نجح ذلك بشكل جيد.

ومع ذلك، فإن التطبيق الذي أعمل عليه الآن يعمل بشكل مختلف قليلاً.

أرغب في إعداد برنامج يستمع إلى حزم tcp/ip دون الحاجة إلى الاتصال.

على سبيل المثال، اطلب من تطبيق إرسال الحزم أن يرسل حزمة إلى برنامجي مع إضافة IP المناسب ورقم المنفذ.

لقد بحثت أيضًا في استخدام Sharppcap وpacket.net ولكن جميع الأمثلة التي وجدتها تستمع فقط على الأجهزة الموجودة محليًا (لا توجد فرصة لتعيين معلمات مثل رقم المنفذ وإضافة IP).

هل لدى أي شخص اقتراح حول كيفية القيام بذلك؟

هل كانت مفيدة؟

المحلول

يجب أن تفكر في استخدام بروتوكول UDP بدلاً من TCP/IP.

http://en.wikipedia.org/wiki/User_Datagram_Protocol

هنا هو الرمز للعميل:

using System.Net;
using System.Net.Sockets;

...

/// <summary>
/// Sends a sepcified number of UDP packets to a host or IP Address.
/// </summary>
/// <param name="hostNameOrAddress">The host name or an IP Address to which the UDP packets will be sent.</param>
/// <param name="destinationPort">The destination port to which the UDP packets will be sent.</param>
/// <param name="data">The data to send in the UDP packet.</param>
/// <param name="count">The number of UDP packets to send.</param>
public static void SendUDPPacket(string hostNameOrAddress, int destinationPort, string data, int count)
{
    // Validate the destination port number
    if (destinationPort < 1 || destinationPort > 65535)
        throw new ArgumentOutOfRangeException("destinationPort", "Parameter destinationPort must be between 1 and 65,535.");

    // Resolve the host name to an IP Address
    IPAddress[] ipAddresses = Dns.GetHostAddresses(hostNameOrAddress);
    if (ipAddresses.Length == 0)
        throw new ArgumentException("Host name or address could not be resolved.", "hostNameOrAddress");

    // Use the first IP Address in the list
    IPAddress destination = ipAddresses[0];            
    IPEndPoint endPoint = new IPEndPoint(destination, destinationPort);
    byte[] buffer = Encoding.ASCII.GetBytes(data);

    // Send the packets
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);           
    for(int i = 0; i < count; i++)
        socket.SendTo(buffer, endPoint);
    socket.Close();            
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top