以前にも同じような質問をしましたが、それを行う方法が見つからないようです。一部のデータが失われ、一部のデータが最後のメッセージの一部として送信される可能性があるため、TCPを介したデータの送信に問題があることを理解しています。リストから一連のコマンドを送信しているので、それらを修正しようとしています。
送信するためのクライアントのコードは次のとおりです。
private void sendBtn_Click(object sender, EventArgs e)
{
try
{
for (int i = 0; i < listORequestedCommands.Items.Count; i++)
{
clientSock.Send(Encoding.Default.GetBytes(listORequestedCommands.Items[i].ToString()), listORequestedCommands.Items[i].ToString().Length, SocketFlags.None);
}
removeAll_Click(sender, e);
sendBtn.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!");
this.Close();
}
}
受信用のサーバーコードは次のとおりです。
private void clientReceived(Client sender, byte[] data)
{
try
{
Invoke((MethodInvoker)delegate
{
for (int i = 0; i < lstClients.Items.Count; i++)
{
Client client = lstClients.Items[i].Tag as Client;
if (client.ID == sender.ID)
{
string incommingCommand = Encoding.Default.GetString(data);
if (incommingCommand.CompareTo("") != 0)
{
lstClients.Items[i].SubItems[1].Text = incommingCommand;
string[] splittedIncommingCommand = incommingCommand.Split(' ');
int numRunProc = 0;
do
{
numRunProc = countProcesses();
}
while ((numRunProc >= maxProcesses) || (numRunProc + Int32.Parse(splittedIncommingCommand[splittedIncommingCommand.Length - 1]) >= maxProcesses));
Process processToRun = new Process();
processToRun.StartInfo.FileName = splittedIncommingCommand[0];
processToRun.StartInfo.WorkingDirectory = Path.GetDirectoryName(splittedIncommingCommand[0]);
processToRun.StartInfo.Arguments = "";
for (int j = 1; j < splittedIncommingCommand.Length; j++)
{
processToRun.StartInfo.Arguments += " " + splittedIncommingCommand[j];
}
processToRun.Start();
}
break;
}
}
});
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!");
this.Close();
}
}
サイズプレフィックスとシリアル化で何かをするように指示されましたが、問題が発生し、それを機能させることができないようです。