Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
mival
Založen: 28. 08. 2010 Příspěvky: 85
|
Zaslal: 8. říjen 2011, 16:05:24 Předmět: |
|
|
Uz to funguje jak ma, ale radsi to jeste otestuji . |
|
Návrat nahoru |
|
|
mival
Založen: 28. 08. 2010 Příspěvky: 85
|
Zaslal: 9. říjen 2011, 10:28:45 Předmět: |
|
|
Dam sem kod, kdyby jste vydeli nejakou chybu nebo neco co bych mohl nejak osetrit, reknete. Vlakna si tam ale hodlam nechat:
SERVER:
kód: |
// ENATHORIA SERVER
//
#define WM_SOCKETEVENT (WM_USER + 1)
#include "stdafx.h"
vector <string> hraci(0);
vector <string> novypole(0);
string moznosti = "\n/stop a /vypnout - VYPNE SERVER \n/zavrit a /close - VYPNE PROGRAM A SERVER \n/start - NAHODI SERVER \n/kick>Koho>duvod - VYKOPNE UZIVATELE \n/size a /velikost - Vypise velikosti poli \n/?, /help a /pomoc - ZOBRAZI NAPOVEDU \n ";
SOCKADDR_IN addr;
int addrlen = sizeof(addr);
SOCKET sListen;
SOCKET sConnect;
int pripojenych = 0;
vector<SOCKET> sockets(0);
long answer;
char message[100];
char uvitani[100];
string strmessage;
string uvitacipozdrav = "Vitam te na nasem serveru.";
////
//////SOUBOR ULOZ
/////
bool uloz(string jmenosouboru, string co)
{
ofstream SouborW(jmenosouboru, ios::app);
SouborW << co;
return true;
}
/////
/////////// SOUBOR NACTI
/////
string nacti(string jmenosouboru)
{
string obsah;
string line;
ifstream myfile (jmenosouboru);
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
obsah += line;
}
myfile.close();
}
return line;
}
////
//////// EXPLODE SPLIT
////
vector<string> explode(string str, string cim)
{
vector<string> text2(1);
string momentalnistring; // lepsi kdyz je to char kdyz pristupujes k charu
int polecislo = 0;
for (int i=0; i < str.length(); i++)
{
momentalnistring= str.at(i);
if(momentalnistring == cim) // misto retezce char (tzn apostrofy)
{
polecislo += 1;
text2.push_back("");
}
else
{
text2[polecislo] += momentalnistring; // nevim proc to tam davas
}
}
return text2;
}
///
///////// PRIJMA KLIENTY
///
class Prijmac : public IRunnable {
public:
Prijmac() {
_pokracovani = true;
}
virtual unsigned long run() {
while(_pokracovani) {
// run this thread procedure
sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen);
if(sConnect!= INVALID_SOCKET)
{
cout<<"Pripojil se ";
answer = recv(sConnect, message, sizeof(message), NULL);
answer = send(sConnect, uvitani,strlen(uvitani)+1,NULL);
cout << message << ".\n";
novypole = explode(message,"|");
hraci.push_back(novypole[1]);
sockets.push_back(sConnect);
u_long arg=1;
ioctlsocket(sockets[sockets.size()-1], FIONBIO, &arg);
pripojenych++;
listen(sListen,1);
}
else
{
}
}
return 0;
}
virtual void stop() {
_pokracovani = false;
}
protected:
bool _pokracovani;
};
///
//////// CTE ZPRAVY OD KLIENTU
///
class Zpravy : public IRunnable {
public:
Zpravy() {
_pokracovani = true;
}
virtual unsigned long run() {
while(_pokracovani) {
if(sockets.size() != 0)
{
for(int i=0; i < sockets.size();i++)
{
u_long arg = i+1;
if(ioctlsocket(sockets[i], FIONREAD, &arg)==SOCKET_ERROR)
{
}
else
{
if(!(recv(sockets[i], message, sizeof(message), NULL) == SOCKET_ERROR))
{
answer = recv(sockets[i], message, sizeof(message), NULL);
strmessage = message;
string text= message;
vector<string>poletextu = explode(text,"|");
string typ = poletextu[0];
if(poletextu[0] == "Zprava")
{
if(poletextu[2] !="" || poletextu[1]!="")
{
cout <<poletextu[1] << ":" << poletextu[2] << "\n";
}
}
else if(poletextu[0] == "New")
{
cout << poletextu[1] << " prisel.\n";
}
Rozesli(message);
}
}
}
}
}
return 0;
}
virtual void Rozesli(char co[100])
{
for(int a=0; a < sockets.size();a++)
{
if(!(send(sockets[a], co,strlen(co)+1,NULL)==SOCKET_ERROR))
{
}
else
{
cout << hraci[a] << "(" << sockets[a] << ")se nejspise odpojil. \n";
closesocket(sockets[a]);
sockets.erase(sockets.begin()+a);
hraci.erase(hraci.begin()+a);
pripojenych-= 1;
}
}
}
virtual void stop() {
_pokracovani = false;
}
protected:
bool _pokracovani;
};
Prijmac *obj2;
Thread *prijmac;
Zpravy *obj;
Thread *zpravy;
void CloseServer()
{
prijmac->stop();
zpravy->stop();
delete prijmac;
delete zpravy;
for(int a=0; a < sockets.size();a++)
{
answer = send(sockets[a], "odpojse|Server byl vypnut nebo necekane spadnul, omlouvame se.",sizeof("odpojse|Server byl vypnut nebo necekane spadnul, omlouvame se."),NULL);
}
closesocket(sConnect);
closesocket(sListen);
for(int a=0; a < sockets.size();a++)
{
closesocket(sockets[a]);
}
}
void main()
{
// Nastaveni nadpisu okna
SetConsoleTitle( "Enathoria Client 0.6.0.1" );
// START SERVERU
start:
/// PROMENE A JEJICH PLNENI
string souborconfig;
//// NACTENI KONFIGURACNIHO SOUBORU
souborconfig= nacti("config.conf");
vector<string> conf_prikazy(1);
conf_prikazy = explode(souborconfig,";");
vector<string> ipadresa(1);
strcpy(uvitani, conf_prikazy[1].c_str());
ipadresa= explode(conf_prikazy[0],":");
WSADATA wsaData;
WORD DLLVERSION;
DLLVERSION = MAKEWORD(2,1);
answer = WSAStartup(DLLVERSION, &wsaData);
///// IP ADRESA
const char* ip=ipadresa[0].c_str();
//// NAPLNENI PORTU
int port= atoi(ipadresa[1].c_str());
sConnect = socket(AF_INET, SOCK_STREAM, NULL);
addr.sin_addr.s_addr = inet_addr(ip);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
sListen= socket(AF_INET, SOCK_STREAM, NULL);
bind(sListen,(SOCKADDR*)&addr, sizeof(addr));
listen(sListen, SOMAXCONN);
cout << "\n";
///
///// VLAKNA THREADY
///
obj2 = new Prijmac();
prijmac = new Thread(obj2);
obj = new Zpravy();
zpravy = new Thread(obj);
prijmac->start();
zpravy->start();
cout << "Cekam na klienty.\n\n\n PRIKAZY: Piste pred ne / - Moznosti:" << moznosti;
vector<string> prikazy(1);
prikazy.push_back("");
prikazy.push_back("");
vector<string> prikaz(1);
prikaz.push_back("");
///
///// PRIKAZOVY RADEK SERVER ADMINA
///
prikazovyradek:
char duvod[100];
string text;
char prikazovy_znak = '/';
getline(cin,text);
// POUZE POKUD ZADA ZNAK PRO PRIKAZ
if(text.at(0) == prikazovy_znak)
{
prikazy = explode(text, "/");
prikaz = explode(prikazy[1], ">");
if(prikaz[0]=="stop" || prikaz[0]=="vypnout")
{
//ADMIN chce vypnout server
cout << "Vypnuli jste server.\n";
}
else if(prikaz[0]=="start")
{
CloseServer();
goto start;
}
else if(prikaz[0]=="?" || prikaz[0]=="help" || prikaz[0]=="pomoc")
{
cout << "\n////\n/////Prikazy:"<< moznosti;
}
else if(prikaz[0]=="size" || prikaz[0] == "velikost")
{
cout <<"Pocet poli v promenne sockets:"<< sockets.size()<<"\n";
cout <<"Pocet poli v promenne hraci:"<< hraci.size()<<"\n";
}
else if(prikaz[0]=="kick")
{
int id=-1;
cout<<"Vykopnuti "<< prikaz[1] <<".\n";
for(int c=0;c<hraci.size();c++)
{
if(hraci[c] == prikaz[1])
{
id = c;
break;
}
}
if(id == -1)
{
cout<<"Spatne jste zadal hrace!\n";
}
else
{
prikaz[2] = "Kick|"+prikaz[2];
strcpy(duvod, prikaz[2].c_str());
send(sockets[id],duvod,strlen(duvod)+1,NULL);
closesocket(sockets[id]);
sockets.erase(sockets.begin()+id);
hraci.erase(hraci.begin()+id);
pripojenych-= 1;
}
}
else if(prikaz[0] == "close" || prikaz[0] == "zavrit")
{
CloseServer();
exit(1);
}
else
{
cout<<"Spatny prikaz!\n";
}
}
else
{
cout << "POZOR !! Nenapsal jste / pred prikaz !! :).\n";
}
goto prikazovyradek;
}
|
CLIENT:
kód: |
////
/////// ENATHORIA CLIENT by MiVal.
////
#include "stdafx.h"
#include "Client.h"
using namespace std;
//
////
///// PROMENNE
////
//
char message[100];
char messageforsend[100];
string confirm;
string prezdivka;
string strmessage;
long answer;
SOCKET sConnect;
SOCKADDR_IN addr;
WSADATA wsaData;
void CloseClient();
////
////// EXPLODE SPLIT
////
vector<string> explode(string str, string cim)
{
vector<string> text2(1);
string momentalnistring; // lepsi kdyz je to char kdyz pristupujes k charu
int polecislo = 0;
for (int i=0; i < str.length(); i++)
{
momentalnistring= str.at(i);
if(momentalnistring == cim) // misto retezce char (tzn apostrofy)
{
polecislo += 1;
text2.push_back("");
}
else
{
text2[polecislo] += momentalnistring; // nevim proc to tam davas
}
}
return text2;
}
////
////// ULOZ
////
bool uloz(string jmenosouboru, string co)
{
ofstream SouborW(jmenosouboru, ios::app);
SouborW << co;
return true;
}
/////
//////// SOUBOR NACTI
/////
string nacti(string jmenosouboru)
{
string obsah;
string line;
ifstream myfile (jmenosouboru);
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
obsah += line;
}
myfile.close();
}
return line;
}
////
////// PRIJMAC ZPRAV
////
class Zpravy : public IRunnable {
public:
Zpravy() {
_pokracovani = true;
}
virtual unsigned long run() {
while(_pokracovani) {
char message[100];
answer = recv(sConnect, message, sizeof(message), NULL);
string text= message;
vector<string>poletextu = explode(text,"|");
string typ = poletextu[0];
if(poletextu[0] == "odpojse")
{
cout << poletextu[1] << "\n";
CloseClient();
}
else if(poletextu[0] == "Zprava")
{
if(poletextu[1] != prezdivka)
{
cout << poletextu[1] << " :"<< poletextu[2] << "\n";
}
}
else if(poletextu[0] == "New")
{
cout << "Vitej" << poletextu[1] << ".\n";
}
else if(poletextu[0] == "Kick")
{
cout<< "Byl jsi vyhozen, Duvod:"<<poletextu[1]<<"\n";
CloseClient();
}
}
return 0;
}
virtual void stop() {
_pokracovani = false;
}
protected:
bool _pokracovani;
};
///
/////// VYTVORENI VLAKEN
///
Zpravy * obj = new Zpravy();
Thread * zpravy = new Thread(obj);
///
/////// Close CLIENT VYPNE PRIPOJENI CLIENTA ,...
///
void CloseClient()
{
zpravy->stop();
delete zpravy;
closesocket(sConnect);
}
///
/////// MAIN - HLAVNI FUNKCE - RIDICI CENTRUM
///
void main ()
{
/////
/////// NASTAVENI
/////
string souborconfig;
souborconfig= nacti("config.conf");
vector<string> ipadresa(1);
ipadresa= explode(souborconfig,":");
SetConsoleTitle( "Enathoria Client 0.6.0.1" );
WORD DLLVersion = MAKEWORD(2,1);
answer = WSAStartup(DLLVersion, &wsaData);
int addrlen = sizeof(addr);
sConnect = socket(AF_INET,SOCK_STREAM,NULL);
const char* ip=ipadresa[0].c_str();
addr.sin_addr.s_addr = inet_addr(ip);
addr.sin_family = AF_INET;
int port= atoi(ipadresa[1].c_str());
addr.sin_port = htons(port);
prezdivka:
cout << "Zadej svou prezdivku:";
getline(cin,prezdivka);
if(prezdivka == "")
goto prezdivka;
cout << "\nChces se pripojit na server? [A/N] " << endl;
getline(cin,confirm);
if(confirm != "A")
{
exit(1);
}
else if(confirm == "A")
{
connect(sConnect, (SOCKADDR*)&addr, sizeof(addr));
strmessage = "New|" + prezdivka;
strcpy(messageforsend, strmessage.c_str());
answer = send(sConnect, messageforsend,strlen(messageforsend)+1,NULL);
answer = recv(sConnect, message, sizeof(message), NULL);
strmessage = message;
cout << strmessage << endl;
}
//
//// SPUSTENI VLAKEN
//
zpravy->start();
A:
string yourmessage;
const char *yourmsg = yourmessage.c_str();
getline(cin,yourmessage);
yourmsg= yourmessage.c_str();
if(yourmsg != "")
{
string zprava = "Zprava|"+prezdivka+"|"+yourmsg;
strcpy(messageforsend, zprava.c_str());
answer = send(sConnect, messageforsend,strlen(messageforsend)+1,NULL);
}
goto A;
system("pause");
closesocket(sConnect);
}
|
Naposledy upravil mival dne 9. říjen 2011, 16:50:35, celkově upraveno 2 krát |
|
Návrat nahoru |
|
|
Weny Sky
Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 9. říjen 2011, 13:53:03 Předmět: |
|
|
Doufam, ze ti "nerozslapu vsechny tve hracky" napsanim toho prospevku. Jen bych te chtel motivovat aby ses vydal spravnym smerem, pokud to myslis s programovanim vazne.
Hodnoceni kodu bych videl jako "Kravina na kvadrat, výplod šílence, debilní paskvil" ... tot slova klasika.
Chapu, je ti 13, ocividne si nejaky cas travil hranim si s nejakym klonem Basicu pripadne nejakeho sileneho skriptovaciho jazyku. A je to poznat. C/C++ znas jen z rychliku. Naucil ses sesmolit neco co sice funguje, urcite se ted citis jako nejvetsi borec a hacker na svete, ale ja osobne bych z neceho takoveho nemel dobry pocit.
Takze moje doporuceni je si sednout a precist nejakou knizku o C++. Nejspis rovnou Mistrovstvi v C++. Dozvis se tam ruzne zasady psani kodu, rozdeleni kodu do souboru, nepouzivani stejnych implementaci funkci, pouzivani sablon ze STL...
Pokud jde o tvuj kod, tak me jeste zarazilo pouzivani GOTO. To neni v C++ zrovna koser. Bezesporu ma sva vyuziti, ve chvíli kdy zjednodusi kod, ktery by se jinak staval nesrozumitelnym. V tvem pripade je ovsem pouzite naprosto zbytecne. Pro nekonecny cyklus stejne tak jako pro opakovani kodu s podminkou na konci ma C++ syntakticke konstrukce. To jen utvrzuje muj pohled na to, ze tvou prioritou by melo byt pokorne studium knih a zlepsovani tvych schopnosti v tomto smeru.
P.S.: i po esteticke strance je to katastrofa, a priste spis pastebin a nebo podobna sluzba, kde se zvyraznuje syntaxe. |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 9. říjen 2011, 16:43:36 Předmět: |
|
|
Plus tam alokuje paměť přes new a nikde to neuklízí Dotyčný by se měl vrátit na zem a vyprdnout se na na C++... a začít pěkně s C, pokud to myslí vážně. Objekty každého hned zkazí Tam se člověk naučí předávat pointery a pracovat s pamětí a není to taková ultra-mega-čunačina jako C++ .. hlavně pro začátečníka _________________ Perry.cz |
|
Návrat nahoru |
|
|
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 9. říjen 2011, 17:09:54 Předmět: |
|
|
No já jsem na takovéto "vykašli se na C++ a nejdříve se nauč C" trochu alergický. Správné programátorské návyky se naučíš stejně dobře na C jako na C++. Vždyť rozdíl je akorát v tom, že místo alloc a free píšeš new a delete a v tom, že "metodám" se pointer na "objekt" předává automaticky. Uznávám, že streamy jsou specialitka, ale k získání správných návyků nepotřebuješ nutně pochopit, jak fungujou streamy.
Dle mého názoru, o kterém jsem nebývale pevně přesvědčen, se programovat naučíš na C++. Musíš trénovat, zpočátku nepoužívat cizí knihovny, zpočátku nepoužívat ani std. Až pochopíš, jak jsou implementovány a jak fungují, pak teprve je můžeš s čistým svědomím použít. A hlavně pochopit do hloubky správu paměti - pointery, reference, dynamicky alokované proměnné, výhoda staticky alokovaných objektů, kopírující konstruktory a tak. Z toho ti pak automaticky vyplyne účel a smysl OOP. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 9. říjen 2011, 17:14:57 Předmět: |
|
|
Číst si nějakou literaturu (Mistrovství v C++ apod.) je super. Rozhodně přečti pár knih.
Není důležitý být nejlepší programátor na světě v tvém věku teď, ale asi tak za 10 let. A to jsem si skoro jistý, že budeš. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 9. říjen 2011, 18:01:22 Předmět: |
|
|
TeaTime napsal: |
Dle mého názoru, o kterém jsem nebývale pevně přesvědčen, se programovat naučíš na C++. Musíš trénovat, zpočátku nepoužívat cizí knihovny, zpočátku nepoužívat ani std. |
Jo.. na C++ se naučíš programovat stejně jako na čemkoliv jiném (skoro), ale C++ je primárně objektový jazyk. Pokud z C++ vyhodíš objekty, tak máš zase C. Nějak mi přijde, že se nějak nerozlišuje v poslední době C a C++. Cílem bylo myšleno nepsat v C++, ale v C.. tudíž začít se učit procedurální programování a pak přejít na objekty. _________________ Perry.cz |
|
Návrat nahoru |
|
|
Tringi
Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 9. říjen 2011, 18:33:58 Předmět: |
|
|
Perry, píšeš kraviny. C++ má k objektově orientovanému jazyku celkem daleko, a je to jen jedno z mnoha paradigmat, které v něm lze aplikovat, ne lepší či horší než sekvenční, procedurální, funkcionální či generické. _________________ WWW | GitHub | TW |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 9. říjen 2011, 19:46:24 Předmět: |
|
|
Jo, objektovost není zas tak závislá na jazyku. Na objekty s dědičností a polymorfismem stačí jen nějaké struktury a možnost přiřadit adresu funkce do proměnné (ukazatel na funkci, handle na funkci, atd.), ze které se ta funkce dá později volat. Toho se dá dosáhnout ve velkém množství jazyků, které typ třídy nemají, přesto se v nich dá psát objektově (např C nebo Lua). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 9. říjen 2011, 20:10:23 Předmět: |
|
|
Dám ti asi nejlepší radu ze všech: Vyser se na to, a jdi raději nahánět holky, a blbni dokud můžeš, věk na to máš a motivace do budoucna je to doslova univerzální.
Až budeš starší tak budeš moct vzpomínat na bouřlivou pubertu a krásně prožité chvíle, a né na nějaké usrané C++ _________________
|
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 10. říjen 2011, 09:38:19 Předmět: |
|
|
Eosie napsal: |
Číst si nějakou literaturu (Mistrovství v C++ apod.) je super. |
Ano, můžete si s wenym v naivitě podat ruce Kdo se v tomhle věku učí, tak chce hned vidět nějaký výsledek, a těžko vydrží číst 14 dní knížku jen nanečisto nebo s trapnými příklady. "Správně" se to klidně naučí až později
Spíš by se ale měl vykašlat na C/C++ a učit se algoritmy v něčem přívětivějším, třeba C# |
|
Návrat nahoru |
|
|
Fila
Založen: 31. 07. 2007 Příspěvky: 853
|
Zaslal: 10. říjen 2011, 15:18:45 Předmět: |
|
|
Mem -- ja nevim, ale ja v tom veku studoval QPascal z 600-strankove knizky a problem jsem s tim nemel.
Nouma -- hledani holek a programovani se nutne nemusi vylucovat, vsak nebude makat 24 hodin denne... |
|
Návrat nahoru |
|
|
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 10. říjen 2011, 23:32:48 Předmět: |
|
|
Pro moderátora: Tohle téma bych přesunul z C++ spíš do Inkubátoru. |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 11. říjen 2011, 06:59:42 Předmět: |
|
|
Al napsal: |
Pro moderátora: Tohle téma bych přesunul z C++ spíš do Inkubátoru. |
Pro Aleyho od Nalima Karcinoma: toto je ciste C++ tema. Neresi se tu zadny konkretni projekt v jeho zarodku. Nevidim duvod "Inkubatorovat" |
|
Návrat nahoru |
|
|
Yossarian
Založen: 28. 07. 2007 Příspěvky: 274 Bydliště: Šalingrad
|
Zaslal: 11. říjen 2011, 08:02:44 Předmět: |
|
|
Fila napsal: |
Mem -- ja nevim, ale ja v tom veku studoval QPascal z 600-strankove knizky a problem jsem s tim nemel.
Nouma -- hledani holek a programovani se nutne nemusi vylucovat, vsak nebude makat 24 hodin denne... |
Radsi pekne studuj. Ja taky studoval, holky nahanel jen okrajove, a ted mam pomerne dobrou praci, a i cas na zenske znami, kteri to delali opacne (v mladem veku chteli hledat baby/chlapy) ted umi hovno, v lepsim pripade maji vystudovanou fildu, nemaji praci a jsou z toho nestastni. he he he. |
|
Návrat nahoru |
|
|
|