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

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

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

Регистрация: Aug 2011
Сообщений: 11
По умолчанию C++ сокет сервер + AS2 клиент

Всем привет, есть одна проблема.
Сервер:
Код:
#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();
}
Клиент:
Код AS1/AS2:
var socket:XMLSocket = new XMLSocket();
socket.onConnect = function(success:Boolean) {
	if (success) {
		o("Connection succeeded!");
		socket.send("ogogo");
	} else {
		o("Connection failed! 1");
	}
};
if (!socket.connect("127.0.0.1", 2803)) {
	o("Connection failed!");
}
socket.onClose = function(){
	o("Connection closed.");
}
socket.onData = function(src) {
	o(src);
};
sendBtn.onRelease = function() {
	socket.send("test string");
};
function o(msg) {
	out.text = msg + newline + out.text;
}
При запуске из среды разработки macromedia flash 8 все работает, при попытке запуска из flash player-а, из браузера, с html-странички, с сайта происходит следующее - в серверной консоли пишется сообщение о том, что клиент подключился, а флешка выдает сообщение "connection failed" (это если в код вставить решение проблемы безопасности):
Код:
 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);
Без этого куска разумеется сервер выдает сообщение про policy.
Подскажите пожалуйста решение проблемы.
Заранее спасибо.

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

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
а в чем проблема то?

Старый 06.11.2012, 09:51
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 3  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Решение проблемы состоит в том, что сервер должен послать клиенту (в ответ на этот запрос) файл кроссдоменной политики и закрыть соединение. После этого клиент должен снова подключиться, уже без этого запроса.

Старый 06.11.2012, 19:07
creator_52 вне форума Посмотреть профиль Отправить личное сообщение для creator_52 Найти все сообщения от creator_52
  № 4  
Ответить с цитированием
creator_52

Регистрация: Aug 2011
Сообщений: 11
Не помогает, такое ощущение что flash-ка просто зависает.
UP

Старый 06.11.2012, 21:22
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Может она правда зависает? Что показывают трейсы?
Возможно сервак начинает ей что-то циклически слать.
Я как-то раз сталкивался с тем (по моей вине конечно ) что сообщение уходило на сервер, возвращалось клиенту и снова уходило на сервер. Получался замкнутый круг из-за которого флешка висла.
Помогло логирование всего, что приходит и отсылается сервером

Суть того, как все должно работать я вкратце описал. Файл политик флешке должен посылаться тоже через сокет

Старый 07.11.2012, 12:24
creator_52 вне форума Посмотреть профиль Отправить личное сообщение для creator_52 Найти все сообщения от creator_52
  № 6  
Ответить с цитированием
creator_52

Регистрация: Aug 2011
Сообщений: 11
Самое интересное то, что из среды разработки все прекраснее некуда, все просто идеально.
Ладно, буду пытаться решить эту проблему с безопасностью.

Старый 07.11.2012, 14:12
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Самое интересное то, что из среды разработки все прекраснее некуда, все просто идеально.
Ну в этом как раз ничего интересного нет. Отладочный СА плеер игнорирует политики безопасности

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

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

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


 


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


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