Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 23:12   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию C++ & C# SOCKET

Здравствуйте, вот у меня есть код на 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.
спасибо заранее за помощь!

Последний раз редактировалось Olejik; 15.01.2013 в 23:16.
Olejik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не перегружается ostream& operator<<(ostream &, Card&) Antej Общие вопросы C/C++ 2 17.12.2012 14:02
Вопрос по поводу меню на сайте, html&css&js antoxa22 HTML и CSS 14 30.12.2011 11:02
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
UDP & Socket Shouldercannon Работа с сетью в Delphi 14 13.10.2008 17:23