情景:C#,TcpClient的多个IP地址,但在同一端口上
我有多个机器,每个机智命中自己的IP,运行一个TCPSERVER,所有在同一端口上。在每个事务中,如果打开了tcpServer端口,则会发送数据。它在开放港口之前寻找客户。
我需要什么:
我正在写一个应用程序,需要:通过IP的名单,如果他们是菱 1.检查 2.打开一个TcpClient的端口,每台机器的IP,(全在相同的端口上) 3.每隔指定的时间后,确保连接处于打开状态,如果没有重新打开连接。
未来:
我使用XML文件,得到用于获取计算机列表和端口上侦听的SQL数据。在这个xml中也是一个udp设置,如果是,那么发送的数据必须被接收并重定向到指定的UDP端口。
的类别:
public static void tcpListen(IPAddress server, int port)
{
try
{
TcpListener listener = new TcpListener(server, port);
listener.AcceptTcpClient();
listener.Start();
while (true)
{
Socket client = listener.AcceptSocket();
var childSocketThread = new Thread(() =>
{
byte[] data = new byte[100];
int size = client.Receive(data);
for (int i = 0; i < size; i++)
feedback = server + ":" + port + ": " + Convert.ToChar(data[i]);
using (StreamWriter w = File.AppendText("TCPLog.log"))
{
Log(feedback, w);
}
client.Close();
});
childSocketThread.Start();
}
}
catch (Exception err)
{
using (StreamWriter w = File.AppendText("error.log"))
{
Log("tcpControl.tcpListen: " + err.Message, w);
}
}
}
代码,每几秒钟重复部分:
private void ptoCheck()
{
IPAddress sourceIP;
int sourcePort;
int destinationPort;
string tcpStatus;
int oldCOunt = dgvWorkstations.RowCount;
int newCount = sqlScripts.posCount(sqlServer, sqlUser, sqlPassword, sqlDatabase);
if (newCount != oldCOunt)
{
getWorkstations();
}
try
{
foreach (DataGridViewRow row in dgvWorkstations.Rows)
{
int i = row.Index;
bool tcpState;
dgvWorkstations["Status", i].Value = "Checking";
dgvWorkstations.Refresh();
name = row.Cells["POS_Name"].Value.ToString();
sourceIP = IPAddress.Parse(row.Cells["LastKnownIP"].Value.ToString());
sourcePort = Convert.ToInt32(row.Cells["Receive_Port"].Value.ToString());
destinationPort = Convert.ToInt32(row.Cells["Send_Port"].Value.ToString());
tcpState = tcpControl.tcpCheck(sourceIP, sourcePort, name);
if (tcpState == false)
{
dgvWorkstations["Status", i].Value = "Connecting";
dgvWorkstations.Refresh();
tcpStatus = tcpControl.tcpConnect(sourceIP, sourcePort, name);
tcpControl.tcpListen(sourceIP, sourcePort);
dgvWorkstations["Status", i].Value = tcpStatus;
}
if (tcpState == true)
{
dgvWorkstations["Status", i].Value = "Connected";
dgvWorkstations.Refresh();
}
i = i + 1;
}
}
catch (Exception err)
{
using (StreamWriter w = File.AppendText("AError.log"))
{
Log("frmMain.ptoCheck: (" + name + ") " + err.Message, w);
}
}//End Catch
}
尝试使用线程或backgroundworkers。我们可以看到你使用的代码吗? – Sergio
可以只有一个IP连接具有相同的3个参数:1)源IP地址,2)目标IP地址3)端口号。当客户端和服务器在同一台PC上时,客户端连接到计算机的IP地址,服务器端会侦听到IPAny,因此不会有任何冲突。当在单台PC上模拟网络时,您需要多个网卡,以便您拥有更多而不是一个IP地址,否则,您需要使用不同的端口号。 – jdweng
我试图添加我用于连接的代码,但它一直显示错误,并说太多字符。 – shinga77