-12

これは最近発生し始めました。コードを使用するたびに、それが間違っていると見なされます。

例えば:

ソケットを作りたいとしましょう

public class PacketReader
{

Socket MainSocket;

MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);                               // acts like MainSocket was never declared

    // Bind the socket to the selected IP address
    MainSocket.Bind(newIPEndPoint(IPAddress.Parse(cmbInterfaces.Text),0));

    // Set the socket options
    MainSocket.SetSocketOption(SocketOptionLevel.IP,  //Applies only to IP packets
                       SocketOptionName.HeaderIncluded, //Set the include header
                       true);                           //option to true

    byte[] byTrue = newbyte[4]{1, 0, 0, 0};
    byte[] byOut = newbyte[4];

    //Socket.IOControl is analogous to the WSAIoctl method of Winsock 2
    MainSocket.IOControl(IOControlCode.ReceiveAll,  //SIO_RCVALL of Winsock
                 byTrue, byOut);

    //Start receiving the packets asynchronously
    MainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
                    newAsyncCallback(OnReceive), null);
}

次に、関数またはクラスの一部で使用しようとすると、「名前はフィールドですが、型として使用されます」として返されます。クラスで宣言するだけで、それを型としてどのように使用しているのかわかりません。

だから私の質問は、これが起こらないようにするにはどうすればよいかということです。すぐに解決策を見つける必要があります。そうしないと、このばかげた問題のために、1 か月以内に予定されているプロジェクトが失敗することになります。

4

3 に答える 3

2

コードがメソッド内にありません。

変数を宣言して、クラス スコープ内で個別に割り当てることはできません。また、ランダムな式をクラス スコープに入れることもできません。コードを次のように変更します。

public class PacketReader
{
    Socket MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

    public PacketReader() {
        // rest of the code here in your constructor
    }
}

これは意地悪に聞こえるかもしれません..しかし、このような基本的な言語構造規則を認識していない場合は、パケット モニターは手の届かないところにある可能性があります。

于 2013-10-16T00:36:26.513 に答える
1

コードを実行するには、コードをメソッドに入れる必要があります。メソッド スコープ外の変数のみを宣言できます。実行する必要があるすべてのステートメントは、メソッド内にある必要があります。失礼なことを言うつもりはありませんが、このようなことを試みる前に、もう少し勉強することをお勧めします。詳細については、この方法のチュートリアルをご覧ください。

public class PacketReader
{
    Socket MainSocket;

    public static void Main()
    {
        MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);                               // acts like MainSocket was never declared

        // Bind the socket to the selected IP address
        MainSocket.Bind(newIPEndPoint(IPAddress.Parse(cmbInterfaces.Text),0));

        // Set the socket options
        MainSocket.SetSocketOption(SocketOptionLevel.IP,  //Applies only to IP packets
                           SocketOptionName.HeaderIncluded, //Set the include header
                           true);                           //option to true

        byte[] byTrue = newbyte[4]{1, 0, 0, 0};
        byte[] byOut = newbyte[4];

        //Socket.IOControl is analogous to the WSAIoctl method of Winsock 2
        MainSocket.IOControl(IOControlCode.ReceiveAll,  //SIO_RCVALL of Winsock
                     byTrue, byOut);

        //Start receiving the packets asynchronously
        MainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
                    newAsyncCallback(OnReceive), null);
    }
}
于 2013-10-16T00:37:46.800 に答える
0

このようなことをしている場合:

Public class YourClass
{
   Socket MainSocket;

   MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

   //other members and methods and so on...
}

たとえば、これを行う...

Public class YourClass
{
   Socket MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

   //other members and methods and so on...
}

次に、残りが必要な場合は(設計と目標に応じて)コンストラクターまたはメソッドに配置できます......

于 2013-10-16T00:24:40.067 に答える