![]() |
|
||||||||||
|
|
|
|||||
|
listener
|
Ну вот, еще один примитивный исходник:
#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();
}
Вообще, есть еще такое интересное понятие, как пул потоков, рекомендую ознакомиться. Цитата:
Цитата:
UPD: немного причесал исходник. это читать для дальнейшего понимания, что есть непримитивный исходник. Последний раз редактировалось alexcon314; 18.01.2010 в 12:39. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 41
|
ООО!!!! Спасибо огромное а ты не подскажешь каким образом можно передать данные из этого сокет сервера как переменные во flash
а т.е. в с++ 2 переменные Name и Sername и их надо передат во flash так чтоб они были там переменными а не просто текстом.. хотя конечно можно по 1 переменной передавать в скрытое текстовое поле и по очереди присваивать перменной значение этого поля =) Просто может есть способ попроще? Мы же вроде используем в самом Флеше XML... я не понимю какой смысл и по моему передается тупо текст а не XML Добавлено через 12 минут А можно как-то клиентами управлять? я запихнул в ваш последний скрипт функцию отправки сообщения клиенту, оправляет но только тму кто последний зашел =) |
|
|||||
|
Регистрация: Aug 2010
Сообщений: 2
|
То ли политика безопасности поменялась, то ли я делаю что-то не так.
К кнопке отправки данных из формы прикреплен следующий код. ( на адресацию внимания не обращайте, потом всё будет более цивильно))) 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);
Подскажите пожалуйста в каком направлении копать. |
|
|||||
|
Регистрация: Aug 2010
Сообщений: 2
|
Пробовал как в 15 посте. Не сработало.
Да, с ИП я перемудрил. Но с доменом тоже не работает. Кликается кнопка один раз, соединение с сервером происходит единожды. Последний раз редактировалось ZeB; 03.08.2010 в 15:56. |
|
|||||
|
listener
|
"xml" ничем от "текста" не отличается, это собственно, тот же текст, только хитро размеченный, так, что его могут парсить разные парсеры (каламбурчик, однако) и вынимать полезную инфу. Во флэше парсит класс XML, в с++ своих парсеров тоже хватает. ПРосто xml удобен, потому популярен. Но это не значит, что xml - панацея.
Цитата:
Цитата:
Цитата:
.Последний раз редактировалось alexcon314; 16.01.2010 в 02:09. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 41
|
Спасибо за ответы многое понял, но вот все таки хочется узнать направление
отправлять клиентам (управлять ими) это к чему надо пристать? Client = accept(Sock, (sockaddr*)&sin, 0); // Ожидание клиента recv(Client, ClientName, 30, 0); // Получение имени компьютера клиента send(Client, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (сервера) но это то да лажно разберусь =) вот только глушь осталась в Цитата:
![]() |
|
|||||
|
listener
|
Передаете с сервера набор переменных.
Скажем, строка "1.2.3.4.5". в onData во флэше делаете примерно так var arr = msg.split(".");// это элементарнейший парсинг элементарнейшей строки.
// рассовываете по флэшовым переменным данные из массива, типа
myVar1 = arr[1];
myVar2 = arr[2];
Цитата:
Последний раз редактировалось alexcon314; 16.01.2010 в 02:39. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 41
|
Цитата:
Низкий поклон ![]() ======================================================================= Подскажи пожалуйста как из этого клиента можно отправить Policy file много чего читал пробывал и т.п. но ничего не помогло ![]() Добавлено через 48 часов 18 минут Все.. разобрался клиент на флеше: 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)) { ну и так далее.... сразу после соединения Последний раз редактировалось stinkybob; 17.01.2010 в 23:13. |
|
|||||
|
listener
|
Что-то не ясно.. вы при клике по кнопке пытаетесь грузить полиси, потом создаете новый сокет, коннектитесь .. и так при каждом клике что ли?
Ну так оно и не удивительно, что при каждом клике флэш, создавая заново коннект, просит каждый раз полиси. А то что в ехе работает, то там механизм соединения несколько иной, насколько мне помнится, ибо требования к безопасности иные. это я вообще впервые вижу, чтобы домен идентифицировался как ip. Разве так можно? Зачем мудрить? Посмотрите эту тему, наверняка в поиске еще что-то найдется, примеры вполне пригодные для понимания и воспроизведения у себя. |
|
|||||
|
listener
|
|
![]() |
![]() |
Часовой пояс GMT +4, время: 02:04. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|