Jump to content
SqRobert

C++ Socket Delay & Broadcast

Recommended Posts

Posted

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().

ClientSide

setsockopt(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?

Posted (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/0J4wfkUW

serv.c http://pastebin.com/PsL1pN5K

Edited by ForTestingPurposes
Posted

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 fragmentate

2. 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.

Posted

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.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...