Gdzie jest trzymana tablica polaczen klientow ?

0

mam taki kod, to sa przykłady nie napisane przeze mnie.

SERVER

 #include <winsock.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>

//using namespace std;

int main(int argc, int **argv)
{
   WSADATA wsda;		      // informacja zwrocona przez WSAStartup
   char szRepMessage[80];     // komunikat zwrotny
   int iMessageLen;
   int ret;
   char szInBuffer[128];		// bufor na otrzymany komunikat
   int iBufferLen;
   int iPort, iAddrLen;

   SOCKET sListen, sClient;			// gniazdo dla nasluchu oraz do klienta
   SOCKADDR_IN addr,remote_addr;    // interfejs lokalny oraz polaczonego klienta


   // port na ktorym sie komunikujemy (0...65535)
   iPort = 1000;

   // zaladuj WinSock w wersji 2.2
   WSAStartup(MAKEWORD(2,2), &wsda);

   // stworzenie gniazda TCP 
   sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

   // sprawdzenie bledu
   if(sListen == SOCKET_ERROR)
   {
      cout << "Blad przy inicjalizacji gniazda : " << WSAGetLastError() << endl;
      system("PAUSE");      
	  exit(1);
   }

   // laczenie gniazda z adresem/portem
   addr.sin_family = AF_INET;
   addr.sin_port = htons(iPort);
   addr.sin_addr.s_addr = htonl(INADDR_ANY);
   ret = bind(sListen, (struct sockaddr *) &addr, sizeof(addr));

   // sprawdzenie bledu
   if(ret == SOCKET_ERROR)
   {
      cout << "Blad przy wiazaniu gniazda : " << WSAGetLastError() << endl;
      system("PAUSE");
      exit(1);
   }

   // ustaw tryb nasluchu
   ret = listen(sListen, 10);

   // sprawdzenie bledu
   if(ret == SOCKET_ERROR)
   {
      cout << "Blad przy trybie nasluchu : " << WSAGetLastError() << endl;
      system("PAUSE");
      exit(1);
   }

   // oczekiwanie na polaczenie
   cout << "Oczekiwanie na polaczenie (nacisnij CTRL-C zeby przerwac)..." << endl;
   iAddrLen = sizeof(remote_addr);
   sClient = accept(sListen, (struct sockaddr *) &remote_addr, &iAddrLen);

   // sprawdzenie bledu
   if(sClient == SOCKET_ERROR)
   {
      cout << "Blad przy nawiazywaniu polaczenia : " << WSAGetLastError() << endl;
      system("PAUSE");
      exit(1);
   }

   cout << "Polaczono z hostem " << inet_ntoa(remote_addr.sin_addr) << endl;

   // odbior komunikatu
   cout << "Oczekiwanie na odpowiedz..." << endl;
   ret = recv(sClient, szInBuffer, sizeof(szInBuffer), 0);

   // sprawdzenie bledu
   if(ret == SOCKET_ERROR)
   {
      cout << "Blad przy odbiorze komunikatu " << WSAGetLastError() << endl;
      system("PAUSE");
      exit(1);
   }
   
   // wyswietlenie komunikatu od klienta
   iBufferLen = ret;
   szInBuffer[iBufferLen] = '\0';
   cout << "Otrzymano komunikat o tresci \"" << szInBuffer << "\"" << endl;

   // wczytanie i wyslanie komunikatu zwrotnego
   cout << "Wpisz komunikat zwrotny...";
   cin.getline(szRepMessage,80,'\n');
   iMessageLen = strlen(szRepMessage);
   ret = send(sClient, szRepMessage, iMessageLen, 0);
   
   // sprawdzenie bledu
   if(ret == SOCKET_ERROR)
   {
      cout << "Blad przy wysylaniu komunikatu zwrotnego : " << WSAGetLastError() << endl;
      system("PAUSE");
      exit(1);
   }
   
   // zamkniecie gniazda
   closesocket(sClient);

   // zamkniecie WinSock
   WSACleanup();
   
   system("PAUSE");

   return 0;

}

Jest on ladnie opisany. Chcialem zrobic tak ze jesli polacze sie do serwera z trzech klientow to jak mozna wybrac w serwerze liste z numerami polaczen ? dla przykladu

Laczy sie klient nr 1 i on ma jakies ip i np jest lista ze podlaczyl sie kkient ClientList[0]
Kolejny klient sie laczy i jest w liscie ClientList[1]
I trzecie klietn jest w ClientList[2]
Teraz jak zrobic zeby serwer wyslal SEND do klienta ktory jest w tablicy ClientList[1] ?
Jest taka tablica tworzona automatycznie juz ? czy trzeba samemu to zrobic odebrac dane
IP i tworzyc tablice ?

I druga sprawa to czy ta lista aktualizuje sie automatycznie ze jak sie rozlaczy
ClientList[1] to kolejne przejda wyzej czy miejsce ClientList[1] zostanie puste.

I trzecia sprawa to trzeba samemu zrobic PING PONGA zeby sprawdzac kto jest podlaczony?

0

Musisz wykorzystać asynchroniczne sockety albo wielowątkowść i potem jeśli masz np taką strukturę:

typedef struct {
std::string nick;
int ID;
SOCKET gniazdo;
} klient

I masz tablicę tych struktur np:

klient wszyscy[3];

To przy połączeniu np nadajesz każdemu kolejne ID czyli 0,1,2 i jeśli chcesz wysłać do osoby z ID 2 to szukasz najpierw w tablicy tej osoby a potem wysyłasz na jej SOCKET'a

W ogóle skąd tu jest jakaś CLientList, sam musisz sobie napisać obsługę czegoś takiego jeśli dobrze Cię zrozumiałem.

0

no wlasnie ClientList to coś co trzeba by zrobic ale to dla zobrazowania. Chociaz keidys kojarze ze bylo bez structury takie cos ze mozna bylo sie odwolac do tablicy klientow przez costam.lista[2] ale nie pamietam wlasnie czy wtedy to bylo z wbudowanej funkcji czy napisane oprogramowane. Chociaz i tak musi gdzies byc lista podlaczonych klientow nawet jesli tego nie oprogramujemy

0

"Chociaz i tak musi gdzies byc lista podlaczonych klientow nawet jesli tego nie oprogramujemy"

Gdzie?

0

Nigdzie, socket to po prostu plik, zgubisz uchwyt i po ptakach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1