Click here to Skip to main content
15,887,421 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
i have two program running on different pc on the same network
when i use UDP they work fine but when i used TCP the client fail to make connection with the server and i can't figured why

TCP SERVER
MSIL
public delegate object ClientConnectHandler(Socket datasocket);
   public delegate void DataReceivedHandler(object obj,byte[] data);
   public delegate void ClientDisconnectHandler(object obj);
   public class TCPServer
   {
       public event ClientConnectHandler WhenClientConnect;
       public event DataReceivedHandler WhenDataReceived;
       public event ClientDisconnectHandler WhenClientDisconnect;
       Socket ConnectionSocket;
       IPEndPoint Endpoint;
       byte[] Data=new byte[10000];
       object obj=new object();
       List<Socket> OnlineClients = new List<Socket>();
       public TCPServer()
       {
           ConnectionSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
           Endpoint = new IPEndPoint(IPAddress.Parse(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString()),6666);
       }
       public TCPServer(string ip, int port)
       {
           ConnectionSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           Endpoint = new IPEndPoint(IPAddress.Parse(ip), port);
       }
       public void Listen()
       {
           ConnectionSocket.Bind(Endpoint);
           ConnectionSocket.Listen(100);
           ConnectionSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
       }
       public void OnClientConnect(IAsyncResult result)
       {
           Socket s = ConnectionSocket.EndAccept(result);
           OnlineClients.Add(s);
           if (WhenClientConnect != null)
               obj = WhenClientConnect(s);
           ConnectionSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
           s.BeginReceive(Data, 0, Data.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), new SSocket {  Object=obj , Socket=s});
       }
       public void OnDataReceived(IAsyncResult result)
       {
           SSocket ssocket = (SSocket)result.AsyncState;
           try
           {
               int size = ssocket.Socket.EndReceive(result);
               if (WhenDataReceived != null)
                   WhenDataReceived(ssocket.Object, Data.Take(size).ToArray());
               Data = new byte[10000];
               ssocket.Socket.BeginReceive(Data, 0, Data.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), new SSocket { Object = obj, Socket = ssocket.Socket });
           }
           catch(SocketException ex)
           {
               if(ex.ErrorCode == 10054)
               {
                   foreach (Socket item in OnlineClients)
                       if (ssocket.Socket == item)
                           OnlineClients.Remove(item);
                   if (WhenClientDisconnect != null)
                       WhenClientDisconnect(ssocket.Object);
               }
           }
       }
       public void Send(Socket socket,byte[] data)
       {
           if(socket!=null)
               socket.Send(data);
       }
   }
   public class SSocket
   {
       object obj;
       public object Object
       {
           get { return obj; }
           set { obj = value; }
       }
       Socket socket;
       public Socket Socket
       {
           get { return socket; }
           set { socket = value; }
       }
   }


TCP CLIENT

MSIL
public class TCPClient
 {
     byte[] data = new byte[10000];
     Socket socket;
     Action<string> action;
     public Socket TCPSocket
     {
         get { return socket; }
     }
     public TCPClient(Action<string> action)
     {
         this.action = action;
     }
     public void Connect(string ipAddress, int port)
     {
         try
         {
             socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(ipAddress), port);
             socket.Connect(ipEndPoint);
             if (socket.Connected)
                 WaitForData();
         }
         catch (SocketException se)
         {
             MessageBox.Show("connection faild," + se.Message);
         }
     }
     private void WaitForData()
     {
         try
         {
             socket.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null);
         }
         catch (SocketException se)
         {
             MessageBox.Show(se.Message);
         }
     }
     private void OnDataReceived(IAsyncResult asyn)
     {
         try
         {
             action(StringConverter.ToString(data));
             WaitForData();
         }
         catch (SocketException se)
         {
             MessageBox.Show(se.Message);
         }
     }
     public void Send(string message)
     {
         try
         {
             socket.Send(StringConverter.ToByteArray(message));
         }
         catch (ArgumentNullException ex)
         { MessageBox.Show("You have to connect to the server first"); }
         catch (SocketException se)
         { MessageBox.Show(se.Message); }
     }
     public void Close()
     {
         socket.Close();
     }
 }



can any one help please
Posted
Updated 14-Feb-11 7:37am
v2
Comments
HimanshuJoshi 12-Feb-11 14:03pm    
Please post the relevant server and client side code.
Sergey Alexandrovich Kryukov 12-Feb-11 14:55pm    
You need to post your code; make it minimal. If you have exceptions, catch and dump in maximum detail, make sure related lines of code are shown.
--SA

1 solution

Using WCF is much simpler, and there's a lot less code involved.

As to your question, make sure that both machines are using the same port for comms. Also be aware that if a port is currently in use, the app running on that box will throw an exception. You could inadvertantly be leaving a port open when the app crashes. WCF handles all this nitpicky stuff for you.
 
Share this answer
 
v3

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900