SqRobert Posted May 2, 2014 Report Posted May 2, 2014 1) Sunt incepator in c++ cu atat mai mult in socket programming UDP. Am reusit sa fac o aplicatie multiplayer dar problema este ca totul merge cu delay. Intrebarea mea este care ar putea fi cauza pentru acest delay ? Aplicatia este setata pe 90 fps pe fiecare pc iar datele de se trimit sunt Inputuri sau un set de coordonate. Daca exista vreo parte anume din cod ce poate ajuta o voi posta cat mai repede cu putinta.2) Aceeasi aplicatie contine clientMode si serverMode , ca si client pornesc aplicatia cu un mesaj de Join() transmis prin broadcast pe 255.255.255.255 la momentul in care Serverul de pe retea primeste mesajul de Join() de la client trimite inapoi acelasi mesaj de Join().ClientSidesetsockopt(Socket, SOL_SOCKET, SO_BROADCAST, (const char *) &onBroadcast, sizeof(onBroadcast));JoinrequestMessage join; sendto(Socket, join.GetBuffer(), join.GetSize(), 0, (struct sockaddr *) &inetServAddr, servLen);ServerSide if (!isJoined) { isJoined = true; JoinrequestMessage join; sendto(Socket, join.GetBuffer(), join.GetSize(), 0, (struct sockaddr *) &inetClientAddr, clientLen); }In momentul cand , ca si client primesc inapoi acel mesaj , trebuie sa creez un socket nou pentru a transmite cu IP-ul fix al server-ului? Pot continua cu sockopt pe broadcast ? Care este optiunea default a socketului defapt? Quote
ForTestingPurposes Posted May 2, 2014 Report Posted May 2, 2014 (edited) Ce mai tin eu minte de la retele :Cel mai bine creezi TCP ( fara pierderi de informatie dar mai slow ), tu ai UDP ( mai rapid dar cu pierderi de informatie, e folosit in cazul streamurilor gen Skype video/audio unde nu prea conteaza daca se pierde cate ceva pe drum, etc. )Tu ai un server si un client :Serverul poate servi clientii iterativ sau concurent ( de obicei este concurent din motive de scalabilitate ). struct sockaddr_in server; // structura folosita de server int sd; // descriptorul de socket sd = socket (AF_INET, SOCK_STREAM, 0); /* crearea unui socket */ /* stabilirea familiei de socket-uri */ server.sin_family = AF_INET; /* acceptam orice adresa */ server.sin_addr.s_addr = htonl (INADDR_ANY); /* utilizam un port utilizator */ server.sin_port = htons (PORT);/* atasam socketul */ bind (sd, (struct sockaddr *) &server, sizeof (struct sockaddr)); /* punem serverul sa asculte daca vin clienti sa se conecteze */ listen (sd, 5);apoi intr-o bucla while(1) accepti clienti si transmiti informatii cu read/write si la sfarsit inchizi conexiunile,acesta este o explicatie in mare, ca sa intelegi /* acceptam un client (stare blocanta pina la realizarea conexiunii) */ client1 = accept (sd, (struct sockaddr *) &from, &length);Client: Multe chestii la fel ca serverul doar ca e folosit pentru a te conecta, nu a accepta alte conexiuni : /* umplem structura folosita pentru realizarea conexiunii cu serverul */ /* familia socket-ului */ server.sin_family = AF_INET; /* adresa IP a serverului */ server.sin_addr.s_addr = inet_addr(argv[1]); /* portul de conectare */ server.sin_port = htons (port);connect (sd, (struct sockaddr *) &server,sizeof (struct sockaddr))Iar apoi faci write/read si ce mai vrei tu iar la sfarsit inchizi conexiunea ( descriptorul de socket) Exemple in C: cli.c http://pastebin.com/0J4wfkUWserv.c http://pastebin.com/PsL1pN5K Edited May 2, 2014 by ForTestingPurposes Quote
compile Posted May 13, 2014 Report Posted May 13, 2014 1. in utilizarea rezonabila un pachet UDP nu ar trebui sa aiba delay la trimitere, spre deosebire de TCP nu astepti nici o confirmare deci viteza depinde doar de numarul si dimensiunea pachetelor, ar trebui sa poti sa trimiti/primesti probabil zeci de mii de pachete pe secunda. Daca e un delay cauta-l in modul in care trimiti, cand trimiti, cat trimiti. Incearca sa ti dimensiunea unui pachet sub 512 octeti ca altfel pot fi fragmentate2. nu cred ca exista vreun motiv pentru care sa trimiti broadcast cand vrei sa comunici doar cu serverul. Incarci reteaua si toate echipamentele din retea degeaba. Dupa ce ai primit confirmarea de la server trimite doar pe IP-ul lui. Quote
SqRobert Posted May 23, 2014 Author Report Posted May 23, 2014 Confirmare de la server primesc dupa ce transmit un mesaj de join pe broadcast. Dupa folosesc tot optiunea de broadcast (pentru ca nu stiu la ce setsockopt() sa setez dupa) sa transmit mesaj doar catre ip-ul serverului. Quote