Здравствуйте, вот у меня есть код на C++ серверная сторона
Код:
DWORD WINAPI MyThread(LPVOID lpParam)
{
int i=0;
int retVal=0,sizemess=0;
char buf[1024],buf2[4096];
printf("Create Thread\n");
while(true)
{
retVal = recv((SOCKET)lpParam,buf,sizeof(buf),0);
if(retVal==0 || retVal == SOCKET_ERROR)
{
printf("Client is disconnect\n");
break;
}
HANDLE FindFile;
WIN32_FIND_DATAA CurrentFile;
strcat(buf,"*.*");
FindFile = FindFirstFileA(buf,&CurrentFile);
printf("buf size: %d\n",sizeChar(buf));
memset(buf,0,1024);
ZeroMemory(buf,1024);
memset(buf2,0,4096);
ZeroMemory(buf2,4096);
printf("buf size: %d\n",sizeChar(buf));
strcpy(buf2,"<?xml version='1.0' encoding='ISO-8859-1'?><Items>");
while(FindNextFileA(FindFile, &CurrentFile))
{
if(CurrentFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
strcat(buf2,"<dir>");
strcat(buf2,CurrentFile.cFileName);
strcat(buf2,"</dir>");
}
else
{
strcat(buf2,"<file>");
strcat(buf2,CurrentFile.cFileName);
strcat(buf2,"</file>");
}
}
strcat(buf2,"</Items>");
for(sizemess=0;buf2[sizemess]!='\0';sizemess++){}
retVal = send ((SOCKET)lpParam, buf2, sizeChar(buf2)+1, 0 );
memset(buf2,0,4096);
ZeroMemory(buf2,4096);
}
return 0;
}
прослушиваем порт 5555, на вход нам обязательно приходит строка с директивой. из которой надо вытащить все файлы и папки и это все разместить в XML.
вот код на C# клиентская сторона
Код:
public void Listing()
{
//mess = path;
//data = Encoding.ASCII.GetBytes(mess);
//client.Send(data, data.Length, SocketFlags.None);
while (true)
{
data = new byte[1024];
try
{
recv = client.Receive(data);
try
{
recv = Convert.ToInt32(Encoding.ASCII.GetString(data));
data = new byte[recv];
recv = client.Receive(data);
mess = Encoding.ASCII.GetString(data);
}
catch (Exception e)
{
mess = Encoding.ASCII.GetString(data);
}
if (EventGetPath != null)
EventGetPath(data);
}
catch (SocketException se)
{
//MessageBox.Show("Код ошибки: " + se.ErrorCode.ToString() + ":" + se.Message);
t.Abort();
return;
}
finally
{
mess = null;
}
}
}
здесь тоже довольно просто, ждем сообщение от сервера, на вход приходит или сначало число, означающее количество передаваемых байтов, а потом само сообщение или сразу сообщение.
Проблема в том, что при первом подключении, сервер отдает сообщение с папками и файлами в XML и клиент спокойно принимает и выводит, но дальнейшие попытки приводят к тому, что, когда клиентская сторона отправляет на сервер новую папку (я смотрел, правильно отсылает клиентская сторона и правильно принимает серверная сторона), сервер принимает, строит XML без ошибок и список папок и файлов в ней верны, отсылает эту строку, а на вход клиентской части приходит, то, что клиентская часть отослала, помогите пожалуйста, в чем может быть загвоздка?
вот на всякий случай еще кусок серверной стороны.
Код:
sockVer = MAKEWORD(1,1);
WSAStartup(sockVer, &wsaData);
SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(servSock == INVALID_SOCKET)
{
printf("Unable to create socket\n");
WSACleanup();
return SOCKET_ERROR;
}
SOCKADDR_IN sin;
sin.sin_family = PF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = INADDR_ANY;
а вот так происходит подключение на клиентской стороне
Код:
public Connect(string addres, int port, System.Windows.Controls.ListView lv)
{
IPHostEntry ipp = Dns.GetHostEntry(addres);
System.Net.IPAddress[] ip = ipp.AddressList;
System.Net.IPAddress ip1;
this.lv = lv;
for (int i = 1; i < ip.Length; i++)
{
ip1 = ip[i];
if (!ip1.IsIPv6LinkLocal && !ip1.IsIPv6Multicast && !ip1.IsIPv6SiteLocal)// && !ip1.IsIPv6Teredo)
{
this.ipep = new IPEndPoint(IPAddress.Parse(ip1.ToString()), port);
break;
}
}
this.client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
Серверная сторона - консольное приложение, а клиентская часть WPF.
спасибо заранее за помощь!