Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.01.2010, 01:28
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 1  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Ну вот, еще один примитивный исходник:
Код:
#include <iostream>
#include <process.h>
#include <windows.h>
#include <conio.h>
using namespace std;
#pragma comment (lib, "ws2_32.lib")
#pragma comment (lib, "mswsock.lib")

unsigned int _stdcall client_thread(void *client_soket)
{
	char Message[200];
	SOCKET Client = (SOCKET)client_soket;
	int len = 0;
	do {
		// Приём сообщения от клиента
		len = recv(Client, Message, 200, 0);

		// Обработка сообщения
		// Если ошибка, выходим из цикла ожидания.
		if(len == SOCKET_ERROR) break;
		
		// Если длина сообщения 0, значит клиент закрыл свой сокет.
		if(len == 0){
			cout << "Client socket closed." << endl;
			break;
		}
		cout << Message << " ";

		// Отправка сообщения клиенту (эхо)
		len = send(Client, Message, strlen(Message) + 1, 0);
		// Если ошибка, выходим из цикла ожидания.
		if(len == SOCKET_ERROR)  break;
		cout << " (echo sent)" << endl;

	} while (1);

	closesocket(Client);
	_endthreadex(0);
	return 0;
}

void main(void) {
	char			hname [64];			// Имя хоста
	WSAData			WSADat;				// Свойства WinSock (результат функции WSAStartup)
	sockaddr_in		server_sin;			// Свойства(адрес) создаваемого сокета сервера
	sockaddr_in		client_sin;			// Свойства(адрес) создаваемого сокета сервера
	SOCKET			Client, Sock;		// Серверный и клиентский сокеты
	WORD			wVersionRequested;	// Версия WinSock
	int				res;
	HANDLE			hThread;
	// Инициализация WinSock 0x0202. Может быть 1.0, 1.1, 2.0, 2.2
	wVersionRequested = MAKEWORD( 2, 2 );
	// WSADat - структура, куда будут занесены результаты инициализации
	if(WSAStartup(wVersionRequested, &WSADat))	
		{cout << "Winsock can't be initialized. Press any key to exit...";	_getch(); return;}
	// Получение имени текущего ПК
	if(gethostname(hname, 64) == SOCKET_ERROR)	
		{cout << "Not host name. Press any key to exit...";	_getch(); return;}
	
	memset (&server_sin, 0, sizeof(server_sin));
	server_sin.sin_family		= AF_INET;	// Тип адреса
	server_sin.sin_addr.s_addr = htonl(INADDR_ANY);	// IP-адрес сервера, здесь 0, можно так: inet_addr("127.0.0.1")
	server_sin.sin_port		= htons(2803);	// Номер порта сервера

	// Создание сокета
	Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	if (Sock == INVALID_SOCKET)	
		{cout << "Error create socket. Press any key to exit...";	_getch(); return;}

	// Связывание созданного сокета с адресом sin
	res = bind(Sock, (sockaddr*)&server_sin, sizeof(server_sin));
	if (res == SOCKET_ERROR)
		{cout << "Error bind socket. Press any key to exit...";	_getch(); return;} 

	// Прослушивание сокета сервером (для подключения клиента)
	res = listen(Sock, SOMAXCONN);			
	if(res == SOCKET_ERROR)
		{cout << "Error listen socket. Press any key to exit...";	_getch(); return;}
	// Ожидание клиента
	hThread = NULL;
	while(1)
	{
		cout << "Wait of client..." << endl;
		// Стартуем поток обработки клента, если таковой был создан после accept
		if(hThread)
		{
			ResumeThread(hThread);
			CloseHandle(hThread);
			hThread = NULL;
		}
		// Если дождались очередного клиента, делаем аccept
		int sin_len = sizeof(client_sin);
		memset (&server_sin, 0, sin_len);
		Client = accept(Sock, (sockaddr*)&client_sin, &sin_len);	
		if(Client == INVALID_SOCKET)
			{cout << "Error accept client. Press any key to exit...";	_getch(); break;}

		// Пытаемся получить имя хоста клиента, его ip и порт
                       HOSTENT *hst;
                       hst = gethostbyaddr((char *)&client_sin. sin_addr.s_addr, 4, AF_INET);
		char port[6] = "";
		_itoa_s(client_sin.sin_port,port,6,10);
                      // Вывод сведений о клиенте
		printf("New client  %s [%s:%s] has connected!\n", (hst) ? hst->h_name : "", inet_ntoa(client_sin.sin_addr),port);

		// Отправка имени этого компьютера (сервера)
		res = send(Client, hname, strlen(hname)+1, 0);
		if(res == SOCKET_ERROR)
			{cout << "Error send. Press any key to exit...";	_getch(); break;}

		cout << " Start client thread...";
		
		// Создаем поток обработки сообщений клиента, стартуем его чуть позже в случае успеха
		hThread = (HANDLE)_beginthreadex(NULL, 0, client_thread, (void*)Client, CREATE_SUSPENDED, NULL);
		if(!hThread)
			{cout << "Error start client thread. Press any key to exit...";	_getch(); break;}

		cout << " ok." << endl;
	}
	CloseHandle(hThread);
	closesocket(Sock);
	WSACleanup();
}
Идея, как видите в том, что "многопользовательский сервер" обрабатывает каждый коннект в отдельном потоке.
Вообще, есть еще такое интересное понятие, как пул потоков, рекомендую ознакомиться.
Цитата:
Каким образом принятые данные из сокет сервера можно преобразовать в переменные и чтобы во флеше все выстроилось как надо
А вот это уже зависит только от того, как вы сами захотите передавать данные: это может быть строка с разделителями, xml или просто любая последовательность байтов.
Цитата:
каким эт образом можно различить юзеров, да даже бонально крестики нолики как свф поймет когда ходит юзер1 а когда юзер2
ну, видимо, принимаемые данные должны содержать не только информацию о ходе игры, но и идентификатор пользователя этот ход совершившего.

UPD:
немного причесал исходник.
это читать для дальнейшего понимания, что есть непримитивный исходник.


Последний раз редактировалось alexcon314; 18.01.2010 в 12:39.
Старый 16.01.2010, 01:36
stinkybob вне форума Посмотреть профиль Отправить личное сообщение для stinkybob Найти все сообщения от stinkybob
  № 2  
Ответить с цитированием
stinkybob

Регистрация: Jan 2010
Сообщений: 41
ООО!!!! Спасибо огромное а ты не подскажешь каким образом можно передать данные из этого сокет сервера как переменные во flash

а т.е.

в с++ 2 переменные Name и Sername
и их надо передат во flash так чтоб они были там переменными а не просто текстом.. хотя конечно можно по 1 переменной передавать в скрытое текстовое поле и по очереди присваивать перменной значение этого поля =) Просто может есть способ попроще? Мы же вроде используем в самом Флеше XML... я не понимю какой смысл и по моему передается тупо текст а не XML

Добавлено через 12 минут
А можно как-то клиентами управлять? я запихнул в ваш последний скрипт функцию отправки сообщения клиенту, оправляет но только тму кто последний зашел =)

Старый 03.08.2010, 14:59
ZeB вне форума Посмотреть профиль Отправить личное сообщение для ZeB Найти все сообщения от ZeB
  № 3  
Ответить с цитированием
ZeB

Регистрация: Aug 2010
Сообщений: 2
То ли политика безопасности поменялась, то ли я делаю что-то не так.

К кнопке отправки данных из формы прикреплен следующий код. ( на адресацию внимания не обращайте, потом всё будет более цивильно)))
Код AS1/AS2:
on (release)
{
	System.security.allowDomain("192.168.136.240");
	System.security.loadPolicyFile("xmlsocket://192.168.136.240:11533");
	var slogin:String = _root.login_obj.txt_login.text;
	var spassword:String = _root.login_obj.txt_password.text;
	var socket:XMLSocket = new XMLSocket();
	socket.connect("192.168.136.240",11533);
	socket.onConnect = function(success:Boolean) {
		if (success) {
 
			socket.send("<lg>"+slogin);
			socket.send("<ps>"+spassword);
		} else {
			trace("Connection failed!");
		}
	};
}
Сервер содержит следующий код на Си.

Код:
Client = accept(Sock, (sockaddr*)&sin, 0); // Ожидание клиента
	char xml[500]="<?xml version='1.0'?> <!DOCTYPE cross-domain-policy SYSTEM 'http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd'> <cross-domain-policy> <allow-access-from domain='*' to-ports='11533' /> </cross-domain-policy>";
	send(Client, xml, strlen(xml) + 1, 0);
	recv(Client, Message, 200, 0); // Получение логина
	printf("%s",Message);

	recv(Client, Message, 200, 0); // Получение пароля
	printf("%s",Message);
Что только не пробовал - на сервер вместо данных идут запросы файла безопасности. Подозреваю дело в плеере, так как, если использовать "exe-флешку" ( Macromedia Flash Proffesional 8 , следовательно 8ой плеер ), то данные идут так как надо.

Подскажите пожалуйста в каком направлении копать.

Старый 03.08.2010, 15:54
ZeB вне форума Посмотреть профиль Отправить личное сообщение для ZeB Найти все сообщения от ZeB
  № 4  
Ответить с цитированием
ZeB

Регистрация: Aug 2010
Сообщений: 2
Пробовал как в 15 посте. Не сработало.
Да, с ИП я перемудрил. Но с доменом тоже не работает.
Кликается кнопка один раз, соединение с сервером происходит единожды.


Последний раз редактировалось ZeB; 03.08.2010 в 15:56.
Старый 16.01.2010, 02:05
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 5  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
"xml" ничем от "текста" не отличается, это собственно, тот же текст, только хитро размеченный, так, что его могут парсить разные парсеры (каламбурчик, однако) и вынимать полезную инфу. Во флэше парсит класс XML, в с++ своих парсеров тоже хватает. ПРосто xml удобен, потому популярен. Но это не значит, что xml - панацея.
Цитата:
в с++ 2 переменные Name и Sername
и их надо передат во flash так чтоб они были там переменными а не просто текстом
переменные вы объявляете во флэше, это вроде обычное дело, нет? А вот то, что им присвоить, вы примете от сервера.
Цитата:
можно по 1 переменной передавать в скрытое текстовое поле и по очереди присваивать перменной значение этого поля =) Просто может есть способ попроще?
Есть.
Цитата:
А можно как-то клиентами управлять? я запихнул в ваш последний скрипт функцию отправки сообщения клиенту, оправляет но только тму кто последний зашел
Пример отправляет любому клиенту его же последнее сообщение по принципу эха и все. Хотите передавать сообщения от клиента клиенту? Ну так организуйте более сложную процедуру обработки сообщений. Мне оно не надо .


Последний раз редактировалось alexcon314; 16.01.2010 в 02:09.
Старый 16.01.2010, 02:21
stinkybob вне форума Посмотреть профиль Отправить личное сообщение для stinkybob Найти все сообщения от stinkybob
  № 6  
Ответить с цитированием
stinkybob

Регистрация: Jan 2010
Сообщений: 41
Спасибо за ответы многое понял, но вот все таки хочется узнать направление

отправлять клиентам (управлять ими) это к чему надо пристать?

Код:
		Client = accept(Sock, (sockaddr*)&sin, 0); // Ожидание клиента
		recv(Client, ClientName, 30, 0); // Получение имени компьютера клиента
		send(Client, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (сервера)
где-то тут если я не ошибаюсь? =)))

но это то да лажно разберусь =)

вот только глушь осталась в
Цитата:
"...способ попроще?"
поясните?

Старый 16.01.2010, 02:32
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 7  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Передаете с сервера набор переменных.
Скажем, строка "1.2.3.4.5".
в onData во флэше делаете примерно так
Код:
var arr = msg.split(".");// это элементарнейший парсинг элементарнейшей строки.
// рассовываете по флэшовым переменным данные из массива, типа
myVar1 = arr[1];
myVar2 = arr[2];
Почитайте еще про сериализацию/десериализацию данных.

Цитата:
..это к чему надо пристать
"это" надо писать на сервере, в обработчике сообщений от клиента. Мало того, сообщение должно быть на абы каким, а содержать команду, т.е. некий набор данных, которые ваш обработчик расценит как руководство к действию "передать то-то такому-то клиенту".


Последний раз редактировалось alexcon314; 16.01.2010 в 02:39.
Старый 16.01.2010, 02:34
stinkybob вне форума Посмотреть профиль Отправить личное сообщение для stinkybob Найти все сообщения от stinkybob
  № 8  
Ответить с цитированием
stinkybob

Регистрация: Jan 2010
Сообщений: 41
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
Передаете с сервера набор переменных.
Скажем, строка "1.2.3.4.5".
в onData во флэше делаете примерно так
Код:
var arr = msg.split(".");// это элементарнейший парсинг элементарнейшей строки.
// рассовываете по флэшовым переменным данные из массива, типа
myVar1 = arr[1];
myVar2 = arr[2];
Почитайте еще про сериализацию/десериализацию данных.

Низкий поклон

=======================================================================

Подскажи пожалуйста как из этого клиента можно отправить Policy file

много чего читал пробывал и т.п. но ничего не помогло

Добавлено через 48 часов 18 минут
Все.. разобрался

клиент на флеше:

Код AS1/AS2:
Security.allowDomain("localhost");
Security.loadPolicyFile("xmlsocket://localhost:1000");
 
var socket:XMLSocket = new XMLSocket();
socket.onConnect = function(success:Boolean) {
	if (success) {
		o("Connection succeeded!");
		socket.send("Boss");
	} else {
		o("Connection failed!");
	}
};
if (!socket.connect("localhost", 1000)) {
 
ну и так далее....
код на с++

сразу после соединения

Код:
    char xml[500]="<?xml version='1.0'?> <!DOCTYPE cross-domain-policy SYSTEM 'http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd'> <cross-domain-policy> <allow-access-from domain='*' to-ports='1000' /> </cross-domain-policy>";

send(Client, xml, strlen(xml) + 1, 0);


Последний раз редактировалось stinkybob; 17.01.2010 в 23:13.
Старый 03.08.2010, 15:44
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 9  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Что-то не ясно.. вы при клике по кнопке пытаетесь грузить полиси, потом создаете новый сокет, коннектитесь .. и так при каждом клике что ли?
Ну так оно и не удивительно, что при каждом клике флэш, создавая заново коннект, просит каждый раз полиси.
А то что в ехе работает, то там механизм соединения несколько иной, насколько мне помнится, ибо требования к безопасности иные.
Код:
System.security.allowDomain("192.168.136.240");
это я вообще впервые вижу, чтобы домен идентифицировался как ip. Разве так можно?
Зачем мудрить? Посмотрите эту тему, наверняка в поиске еще что-то найдется, примеры вполне пригодные для понимания и воспроизведения у себя.

Старый 03.08.2010, 16:04
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 10  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
http://www.flasher.ru/forum/showthread.php?t=135168

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:04.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:04.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.