2012-11-30 193 views
0

我的服务器套接字代码出现问题 - Main()方法中的循环只执行一次,从不接受任何进一步的输入。监听套接字只侦听一次

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(); 
     } 
    } 
} 
+0

'Nwork.servSock'与'Server.servSock'相同吗?你确定你只想将服务器套接字绑定到本地主机上吗? –

回答

0

我不知道“Nwork”是什么,但我怀疑这是你的bug的来源。只需手动初始化套接字就可以工作,并允许后续连接。

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(); 
    } 
} 
+0

嗯问题semms将消失,如果我没有nwork班,但我仍然无法找出问题。 Thx给所有人 –

0

没有在你的代码深潜,我会尝试在for循环中添加s.Listen(BACKLOG)。
请注意,通过这种方式,您只能同时处理套接字连接,如果另一个人要尝试打开套接字连接,则您的进程将忙于接收来自先前连接的数据。
这取决于你的情况,但你可能想要实现它的异步。如果你决定这样做,
This link可能是有用的。

+0

如果我添加s.Listen(BACKLOG),问题仍然存在 –

+0

“Listen”仅将套接字标记为侦听套接字,并设置传入连接队列的大小,并且只应调用一次。 –