2014-11-11 2 views
0

У меня есть C# сервер работает под Ubuntu 12.04 с использованием Mono, с помощью следующего кода:с сервером # TCP сокетов не отвечает на клиент

while (true) 
{ 
    Console.WriteLine("Socket ready..."); 
    using (Socket handlerSocket = listenerSocket.Accept()) 
    { 
     Console.WriteLine("New request..."); 
     BackgroundWorker newBackgroundWorker = new BackgroundWorker(); 
     byte[] buffer = new byte[1024]; 
     Console.WriteLine("Buffer allocated..."); 
     handlerSocket.Receive(buffer); 
     //newBackgroundWorker.DoWork += (s, o) => 
     //{ 
     using (Socket Sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      Console.WriteLine("Buffer received..."); 
      string request = Encoding.Unicode.GetString(buffer); 
      Console.WriteLine("New request from : {0} /t Request : {1}", ((IPEndPoint)handlerSocket.RemoteEndPoint).Address.ToString(), request); 
      if (request.Contains("$GetBattleList")) 
      { 
       //Chain of if's and else's continues 
       //The following else if is the only case being tested 

      else if (request.Contains("$GetZeroBasedProfile")) 
      { 
       Console.WriteLine("Sending profile..."); 
       Sender.Connect(handlerSocket.RemoteEndPoint); //Fails here due to not being able to reach the client application, throws a timeout exception 
       Sender.SendFile(_profileLocation); 
      } 
      else Console.WriteLine("Invalid request. Ignoring..."); 
     } 
    } 
} 

Сервера способен принимать запросы клиентов, но тем не менее не в состоянии потому что он не может подключаться каждый раз. Я что-то пропустил в своем коде или что-то еще здесь работает?

ответ

1

Когда вы принимаете соединение с использованием серверного сокета, то, что вы получаете, является сокетом, подключенным к клиенту. Вам не нужно создавать новый сокет для подключения (на самом деле вы не можете). Таким образом, вместо создания и использования Sender просто используйте handlerSocket:

handlerSocket.SendFile(_profileLocation); 
3

Дополнительное гнездо Sender, которое вы заявляете, не нужно. handlerSocket, который вы получаете от listenerSocket.Accept(), уже является сокетом, который вы можете использовать для связи с клиентом.

Смежные вопросы