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
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
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