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?