2015-04-08 74 views
0

我的代碼SocketException被抓獲

此代碼爲服務器

class Program 
    { 
     private static readonly byte[] Localhost = {127,0,0,1}; 
     private const int Port = 8567; 


     static void Main(string[] args) 
     { 
      var address = new IPAddress(Localhost); 
      var endPoint = new IPEndPoint(address, Port); 

      var listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      try 
      { 
       listener.Bind(endPoint);// Error in this line 
       listener.Listen(3); 

       String data = ""; 

       while (true) 
       { 
        Console.WriteLine("Listening on sport {0}", endPoint); 


        byte[] buffer = new byte[4096]; 

        // handle incoming connection ... 
        var handler = listener.Accept(); 
        Console.WriteLine("Handling incoming connection ..."); 
        while (true) 
        { 
         int count = handler.Receive(buffer); 
         data += Encoding.UTF8.GetString(buffer, 0, count); 

         // Find start of MLLP frame, a VT character ... 
         int start = data.IndexOf((char) 0x0B); 
         if (start >= 0) 
         { 
          // Now look for the end of the frame, a FS character 
          int end = data.IndexOf((char) 0x1C); 
          if (end > start) 
          { 
           string temp = data.Substring(start + 1, end - start); 

           // handle message 
           string response = HandleMessage(temp); 

           // Send response 
           handler.Send(Encoding.UTF8.GetBytes(response)); 
           break; 
          } 
         } 
        } 

        // close connection 
        handler.Shutdown(SocketShutdown.Both); 
        handler.Close(); 

        Console.WriteLine("Connection closed."); 

       } 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Exception caught: {0}", e.Message); 
      } 
      Console.WriteLine("Terminating - press ENTER"); 
      Console.ReadLine(); 
     } 

private static string HandleMessage(string data) 
     { 
      Console.WriteLine("Received message"); 

      var msg = new Message(); 
      msg.Parse(data); 

      Console.WriteLine("Parsed message  : {0}", msg.MessageType()); 
      Console.WriteLine("Message timestamp : {0}", msg.MessageDateTime()); 
      Console.WriteLine("Message control id : {0}", msg.MessageControlId()); 


      // ********************************************************************* 
      // Here you could do something usefull with the received message ;-) 
      // ********************************************************************* 


      // todo 


      // Create a response message 
      // 
      var response = new Message(); 

      var msh = new Segment("MSH"); 
      msh.Field(2, "^~\\&"); 
      msh.Field(7, DateTime.Now.ToString("yyyyMMddhhmmsszzz")); 
      msh.Field(9, "ACK"); 
      msh.Field(10, Guid.NewGuid().ToString()); 
      msh.Field(11, "P"); 
      msh.Field(12, "2.5.1"); 
      response.Add(msh); 

      var msa = new Segment("MSA"); 
      msa.Field(1, "AA"); 
      msa.Field(2, msg.MessageControlId()); 
      response.Add(msa); 


      // Put response message into an MLLP frame (<VT> data <FS><CR>) 
      // 
      var frame = new StringBuilder(); 
      frame.Append((char) 0x0B); 
      frame.Append(response.Serialize()); 
      frame.Append((char) 0x1C); 
      frame.Append((char) 0x0D); 

      return frame.ToString(); 
     } 
    } 

,但我得到以下錯誤:

SocketException was caught :- An attempt was made to access a socket in a way forbidden by its access permissions

請給我任何解決方案。

+0

上線和你在哪裏得到的異常,客戶端或服務器? –

+0

我有寫評論錯誤行代碼和服務器的此代碼 – Honey

+0

如果讀取邊界落在代碼點的中間,則您的utf8解碼將失敗。 – CodesInChaos

回答

1

異常消息表明您無權訪問您創建的套接字。這可能是由於已經使用的套接字或用戶運行此進程的權限低於必要的權限(非管理員權限;這不太可能是您的案例中出現異常的原因)。

爲了檢查某個進程是否已經在使用插座,打開命令提示符,然後執行:

netstat -o | find "8567" 
+0

我檢查了netstat -o |找到「8567」命令,我看到8567端口沒有顯示在列表中。 – Honey

+0

您是否有任何本地防火牆或防病毒軟件正在運行?你有沒有嘗試過使用另一個端口號?或者使用管理員權限運行應用程序? –