[WinSock]Wysyłanie pakietu do wybranego klienta.

0

Witam, szukałem dużo w google i na stronach o programowaniu, ale nie znalazłem odpowiedzi na interesujące mnie zagadnienie, a dokładniej:

Powiedzmy, że mamy serwer, podłącza się do niego 3 klientów, wiem jak wysłać pakiet do nich wszystkich, ale jak wysłać pakiet powiedzmy do wybranego przez nas klienta?
Przedstawię to na przykładzie:
Klient A chce wysłać prywatną wiadomość do klienta B, klient A wysyła pakiet do serwera, teraz chce by serwer znalazł klienta B i wysłał do niego pakiet.

Proszę o pomoc.

0

serwer trzyma identyfikatory wszsytkich klientow, oraz ich adresy.
klient wysyla wiadomosc, a polu odbiorcy podaje id klienta.
server odsula msg do klienta.

0

Dobrze, to teraz chciałbym zapytać, jak stworzyć "mapę" id klientów? W przypadku polecenia send() (bo korzystam z TCP), jakoś nie mogę wymyślić w jaki sposób można by było wysłać to do wybranego klienta...
Chyba, że tworzyć gniazda połączone o takiej samej nazwie jak nick, który wybierze dany klient? Ale jakoś mi to nie pasuje..

0

Zalezy w jaki sposob serwer obsluguje wielu klientow, jesli na procesach, to przy kazdym nowym polaczeniu jest tworzony nowy proces o innym numerze pid, dzieki czemu mozesz sobie zapisywac te numery.
fork zwraca numer pid, wiec jesli sie polaczy pierwszy klient to zapisujesz jego, pid dajmy na to w tablicy, jesli drugi to zapisujesz w nastepnym elemencie tablicy itd.
Taki sposob pozwala rozronic klientow na podstawie czasu polaczenia.

Malo napisales, bo sposob, w jaki bym to zrobil bylby zalezny od zastosowania/przeznaczenia serwera i sposobu obslugi wiekszej liczby klientow.

0

Jak na razie przeznaczenie serwera to jedynie pobieranie i wysyłanie danych(pozycja, nick, punkty) oraz chat. Maksymalnie 10 klientów.

Serwer używa funkcji select(), co mogę zrobić w takim przypadku by móc pobrać jakiekolwiek dane, dzięki którym serwer może ich rozróżnić?

Będę wdzięczny za jakiekolwiek wskazówki, ew. linki do dokumentacji gdzie mogę te zagadnienie znaleźć.

0

obsluga klientow na procesach to debilizm w czystej postaci.
ilosc procesow dzialajacych w jednej przestrzeni adresowej powinna byc = ilosci rdzeni na CPU, a zadania dzielone na kazdy z nich. Tzn optymalny stan jest wtedy, kiedy kazdy watek/proces jest aktywny w 1 momencie. Kazdy watek/process powinien byc tworzony dokladnie w tym samym miejscu, a ich zadanie sterowane mutexami. od windows, kazdy watek powinien rowniez obserwowac nastepny, tworzac taka liste jednostronna. Ze jak jeden zostanie zabity, mozna wywalic proces. To jest koneczne, ze wzgledu fakt ze ubijajac watek pewne zasoby sa skazane na zostanie w pamieci tak dlugo jak dziala caly proces co prowadzi do potencjalnego Denial Of Service.

Będę wdzięczny za jakiekolwiek wskazówki, ew. linki do dokumentacji gdzie mogę te zagadnienie znaleźć.

jesli robisz cos na zaliczenie/zlecenie - odpusc sobie. Nie wyrobisz sie. Gdy bedziesz mial wiedze odpowiednia do realizacji projektu - nie bedziesz potrzebowal dokumentacji.

Serwer używa funkcji select(), co mogę zrobić w takim przypadku by móc pobrać jakiekolwiek dane, dzięki którym serwer może ich rozróżnić?

tworzysz strukture, taka dosc nietypowa:

pierw handle do socketow, pozniej pointer na dane + callback.
dane to przyporzadkowany id klienta, callback to funkcja ktora sie wywola jak select() zwroci.
najwazniejsze to zeby po rozlaczeniu klienta przywracac id do postaci ciaglej. tzn dekrementowac kazdego nastepnego klienta, oraz wszystkim wyslac wiadomosc 'klient XX wypadl', by przed inicjalizacja wysylania danych mogli odswiezyc rekord, a w razie jej trwania - zmienic niz wysylac dane do starego.

W c tego nie napiszesz btw ;) A nawet jak ci sie uda to kod pedzie paskudny.

...zaraz, select + winsock? czy ja oczyms nie wiem?
select to pod linuxa, winsock ma swoje funkcje, ja polecam WriteFile/ReadFile OVERLAPPED, a oczekiwanie na eventy. Nie uzywaj funkcji ReadFileEx/WriteFileEx bo APC nie przyjmuje argumentow - wiec nie mozesz jej przekazac zmiennej a wtedy ich sens mija sie z celem. WSASend/WSARecv tez do kitu bo musisz sie [CIACH!] w WSABUF (tzn zaalokowac dodatkowa strukture, zeby tylko w niej adresowac bufor i jego rozmiar anizeji przekazac to na stosie, a ilosc WSABUF jest bez sensu.)
Nie poradzisz sobie, za duzo rzeczy o ktorych trzeba pamietac.

0

Nie robię tego na zaliczenie, po prostu mnie to interesuje ;) No nic, posprawdzam to o czym mi mówiłeś i w końcu znajdę sposób ;)

Nie poradzisz sobie, za duzo rzeczy o ktorych trzeba pamietac.

To czy sobie poradzę to raczej zależy od mojej cierpliwości i chęci do zrobienia tego ;>

W c tego nie napiszesz btw A nawet jak ci sie uda to kod pedzie paskudny.

Skoro są ludzie, którzy piszą coś takiego, tzn. że można :P

W każdym razie dziękuje za pomoc.

0

To czy sobie poradzę to raczej zależy od mojej cierpliwości i chęci do zrobienia tego ;>

zycze ci jaknajwiecej cierpliwosci, ale zacznij moze od czegos innego.
moze najpierw 1 klient - 1 serwer, i opanuj obsluge socketow, protokolu IP4, TCP/UDP.
A jeszcze wczesniej zapoznaj sie z modelem IO w windows. Lacznie z tym co w kernel mode. Lacznie z nieudokumentowanymi funkcjami/operacjami/mechanizmami. Musisz tez wszstko, zawzse sie trafi jakis slepy punkt ze utkniesz, zaufasz komus z rozwiazaniem, a ktos ci wrzuci backboora lub blad. Albo stracisz cierpliwosc. Z 90% nie bedziesz kozystal, ale swiadomosc ze wiesz jak to dziala uchroni cie od bledow i pozwoli ogarnac calosc aplikacji. Potem bedziesz mogl dopasowac co i jak, stworzyc wlasny model programu i przesylania danych, i ruszyc z pisaniem. Wiem ze wydaje sie duzo, ale jak chcesz byc w tym najlepszy to musisz to ogarnac (i to nie byle jak, ze zrozumeniem).

Wiec lepiej zanim wezmiesz sie za konkretne, abstrakcyjne problemy, zajmij sie dzialaniem systemu pod ktory piszesz, a jak wszsytko (99.999%) zrozumiesz, to mozesz sie starac o prace w m$ ;)

Skoro są ludzie, którzy piszą coś takiego, tzn. że można :P

No bo mozna, ale kod bedzie brzydki. Ale to twoj wybor ze chcesz pisac w c. Tylko blagam nie uzywaj makefile do swoich projektow, lepiej katalog z naglowkami .h i plikami .c/.cpp, i instrukcja jakie argumenty przekazac kompilatorowi.

0
ger543 napisał(a)

...zaraz, select + winsock? czy ja oczyms nie wiem? select to pod linuxa, winsock ma swoje funkcje (...)

W tym... funkcję select :>

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