|
|
|||||
[+1 25.04.11]
|
Сервер для Flash на C++ (socket)
Как на с++ сделать сервер, документации, или чтото. И как его седенить?
Да я порылся в интренете нашол кучу всякого, вот к примеру server Ruby: http://haxe.ru/node/134 никогда не слышал об таком языке программирования Начитался что после С++ надо какуюто платформу что такое платформа ? Нашол какуюто ссылку плотформу ACE . Та даже самый просто php чат как сделать? у меня есть прекрасный исходник пхп чата флеш+пхп , я взял шаровый пхп хостинг, ну и всеровно, чат никак не могу запустить. Дальше: Простейшая передача числа из клиента к серверу (тоесть у примеру с сайта на сервер у меня на компьютере ip: port). Как такое сделать? как сделать чтобы к примеру записалось число в xml файл и это число сразу отобразилось у другой флешки. Короче словом, как сделать сервер для потокового приема и отдачи хотябы чисел. Можно самый примитивный, или исходник какойто. Помогите розобратся в этой мурне ) |
|
|||||
listener
|
От всей души вкладываю примитивный исходник, рабочий, проверял в связке с флэшем:
#include <iostream> using namespace std; #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") #pragma comment (lib, "mswsock.lib") void main(void) { char PCName [30], ClientName[30], Message[200]; WSAData WSADat; // Свойства WinSock (результат функции WSAStartup) sockaddr_in sin; // Свойства(адрес) создаваемого сокета SOCKET Sock, Client; // Серверный и клиентский сокеты WSAStartup(0x0202,&WSADat); // Инициализация WinSock // 0x0202 - версия WinSock. Может быть 1.0, 1.1, 2.0, 2.2 // WSADat - структура, куда будут занесены рез. инициализации gethostname(PCName, 30); // Получение имени текущего ПК sin.sin_family = AF_INET; // Тип адреса sin.sin_addr.s_addr = 0; // IP-адрес сервера (пори создании сервера можно 0) sin.sin_port = htons(2803); // Номер порта сервера Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Создание сокета bind(Sock, (sockaddr*)&sin, sizeof(sin)); // Связывание созданного сокета с адресом sin // ***** Ожиданеи клиента cout << "Wait of client..." << endl; listen(Sock, SOMAXCONN); // Прослушивание сокета сервером (для подключения клиента) Client = accept(Sock, (sockaddr*)&sin, 0); // Ожидание клиента recv(Client, ClientName, 30, 0); // Получение имени компьютера клиента send(Client, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (сервера) cout << "Client ( " << ClientName << " ) has connected!" << endl; // ***** Меню int Menu; do { cout << "1. Send message;" << endl; cout << "2. Get Message;" << endl; cout << "3. Quit;" << endl; cout << "Make your selection: "; cin >> Menu; switch (Menu) { case 1: // Отправка сообщения клиенту cout << "Enter message: "; cin.get(); cin.getline(Message, 200); if (send(Client, Message, strlen(Message) + 1, 0) != SOCKET_ERROR) cout << "Sent!\n"; else cout << "Error of sending!\n"; break; case 2: // Приём сообщения от клиента if (recv(Client, Message, 200, 0) != SOCKET_ERROR) { cout << Message << endl; cin.get(); } else cout << "Error of getting!\n"; break; }; cout << endl; } while (Menu != 3); // Закрытие сокетов и окончание работы с WinSock closesocket(Sock); closesocket(Client); WSACleanup(); } Да, хорошо бы подковаться малость, а то опять тема получится никакая. Последний раз редактировалось alexcon314; 29.12.2009 в 18:17. |
|
|||||
[+1 25.04.11]
|
alexcon314
Полегчало =) но ещё интересует как подконектить к нему флешку ??? |
|
|||||
listener
|
Ну, как подконнектить... так вот, примерно:
// AS 2.0 socket client code var socket:XMLSocket = new XMLSocket(); socket.onConnect = function(success:Boolean) { if (success) { o("Connection succeeded!"); socket.send("ogogo"); } else { o("Connection failed!"); } }; 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(toSend.text); }; function o(msg) { out.text = msg + newline + out.text; } |
|
|||||
Регистрация: Jan 2010
Сообщений: 41
|
Спасибо все классно все работает только есть 2 вопроса
1) при компиляции в swf и при запуске этого swf плеер сообщает что производится попытка небезпасной операции (как это убрать чтобы не у меня ни у остальных клиентов этой ошибки не было) 2) Сокет позволяет только 1 соединение? просто если запускать 2 клиента то 1 не работает, или это зависит от самого сокет сервера? =) Заранее спс за ответы |
|
|||||
listener
|
1. Это нормально. Так работает система безопасности плеера. Разберитесь с ней.
2. Исходник примитивный. Это просто иллюстрация, демонстрирующая некоторые базовые принципы. Если хочется что-то получше, ну... я не знаю. В сети полно исходников и компонент для сборки сервера. Вы сделали первый шаг, так не останавливайтесь. |
|
|||||
Регистрация: Jan 2010
Сообщений: 41
|
ММ а подскажите пожалуйста каким образом с ней можно разобраться =) и так чтоб не только у себя =) и кстати ошибку такую выдает только если свфку запускаешь а когда на веб сервер выкладываешь так сразу коннект еррор но ошибки той нету
|
|
|||||
Регистрация: Jan 2010
Сообщений: 41
|
Сижу весь день ломаю голову как сделать "многопользовательский сервер" ничего пока не вышло
Я еще вычитал что надо делать 2 сокетами 1 соединяет 2 меняет данные Если не сложно может накините какой-нибудь примерчик И вобще как образом осуществить весь процесс этого онлайна, где копать, что необходимо. Цель у меня такая: -Есть база Mysql в ней допустим [login, pass, lvl, exp, hp] -Есть сайт PHP в нем все бонально просто [авторизация, после логина доступ к игре, от туда мы выхвавтыаем $_SESSION['login'] пихаем во flash дальше из Flash'a посылаем запрос на сокет сервер [login] ] -Сокет сервер [берет этот [login] и на основании его делает запрос в базу откуда выхватывает всю строку и посылает обратно ] -Flash уже действует дальше на основании этих данных Вроде все понятно (сама структура) поправьте меня если все происходит не так Половиу из этого я знаю как реализовать половину нет -Каким образом принятые данные из сокет сервера можно преобразовать в переменные и чтобы во флеше все выстроилось как надо -Как сделат так чтобы при обращении к сокет серверу происходило какбы потоковое действие и не надо было ждать пока 1 пользователь закончит общаться с сокетами -и вот самого главного я не пойму каким эт образом можно различить юзеров, да даже бонально крестики нолики как свф поймет когда ходит юзер1 а когда юзер2 =) БОЛЬШАЯ просьба если кому не трудно, кто сталкивался или просто знает, дайте плз совет, ссылку, пример, все что угодно! Огромный поклон, Спасибо! Последний раз редактировалось stinkybob; 16.01.2010 в 00:00. |
|
|||||
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. |
Часовой пояс GMT +4, время: 10:26. |
|
« Предыдущая тема | Следующая тема » |
|
|