0

以下のサーバー ソケット コードに問題があります。メソッド内のループがMain()1 回しか実行されず、それ以上入力を受け付けません。

class Server
{
    public Socket servSock(int Port)
    {
        Socket s1 = null;
        IPHostEntry ipHE = Dns.GetHostEntry("localhost");
        IPAddress ipA = ipHE.AddressList[0];
        IPEndPoint ipEp = new IPEndPoint(ipA, Port);
        s1 = new Socket(ipEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        s1.Bind(ipEp);

        return s1;
    }

    const int BUFFSIZE = 1024;
    const int BACKLOG = 255;

    static void Main(string[] args)
    {            
        Nwork nwork = new Nwork();
        Socket cl = null;
        Socket s = nwork.servSock(400);
        s.Listen(BACKLOG);

        byte[] rcvBuffer = new byte[BUFFSIZE];            

        for (; ; )
        {
            string text = "";

            Console.Clear();
            cl = s.Accept();                    
            Console.Write("Handling Client >> " + cl.RemoteEndPoint +"\n\n\n");
            cl.Receive(rcvBuffer, BUFFSIZE, SocketFlags.None);
            text = Encoding.ASCII.GetString(rcvBuffer, 0, BUFFSIZE).TrimEnd('\0');
            Console.Write(text);
            cl.Close();
        }
    }
}
4

2 に答える 2

0

「Nwork」が何であるかはわかりませんが、それがバグの原因であると思われます。ソケットを手動で初期化するだけでうまくいき、その後の接続が可能になります。

static void Main(string[] args)
{
    Socket s = new Socket(SocketType.Stream, ProtocolType.TCP);
    Socket cl = null;
    System.Net.IPEndPoint endpoint = new System.Net.IPEndPoint(0, 400); // listen on all adapters on port 400
    s.Bind(endpoint);

    s.Listen(BACKLOG);

    byte[] rcvBuffer = new byte[BUFFSIZE];

    for (; ; )
    {
        string text = "";

        Console.Clear();
        cl = s.Accept();
        Console.Write("Handling Client >> " + cl.RemoteEndPoint + "\n\n\n");
        cl.Receive(rcvBuffer, BUFFSIZE, SocketFlags.None);
        text = Encoding.ASCII.GetString(rcvBuffer, 0, BUFFSIZE).TrimEnd('\0');
        Console.Write(text);
        cl.Close();
    }
}
于 2012-11-30T08:16:45.780 に答える
0

コードを深く掘り下げることなく、 for ループに s.Listen(BACKLOG) を追加してみます。
この方法では、同時に i ソケット接続しか処理できないことに注意してください。別の人がソケット接続を開こうとすると、プロセスは以前の接続からのデータの受信でビジーになります。
シナリオによって異なりますが、非同期で実装することをお勧めします。
このリンクは、そうすることにした場合に役立つ場合があります。

于 2012-11-30T06:36:03.560 に答える