이전에 비슷한 질문을했지만 그 방법을 찾지 못했습니다. 일부 데이터가 손실 될 수 있고 마지막 메시지의 일부로 일부 데이터가 올 수 있으므로 TCP를 통해 데이터를 전송할 때 문제가 있음을 이해합니다. 목록에서 일련의 명령을 보내는 중 수정하려고합니다.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();
}
}
, 하지만 문제가 생겨서 제대로 작동하지 않는 것 같습니다.
기본 구조를 이해하고 있거나 문제에 대한 해결책을 찾고 싶습니까? – MarcF
TCP에 대한 이해가 잘못되었습니다. TCP는 패킷이 순서대로 전달되고 패킷 손실없이 전달되도록합니다. 자세한 내용은 http://en.wikipedia.org/wiki/Transmission_Control_Protocol을 참조하십시오. –
사실 나는 둘 다에 관심이 있습니다. 지금은 솔루션이 필요합니다. 버전을 릴리스해야하기 때문입니다. 그러나 앞으로의 사용을 위해이 정보를 이해하고 싶습니다. 감사. – Idanis