pthreads i socket

0

mam nadzieje ze nie zagmatwam za bardzo.
otwieram watek ktory czeka na nowe polaczenia wykorzystuje do tego funkcje accept i tu sie pojawia problem. watek zatrzymuje sie w tym miejscu dopoki nie przyjdzie nowe zgloszenie a ja chcialbym tylko sprawdzic czy polaczyl sie juz ktos nowy i ewentualnie potem wykonac procedury dla nowego klienta. druga sprawa wyglada tak: accept wita nowego klienta prztydziela mu numerek w dalszej czesci programu otwieram watek obslugujacy klienta niestety po wywolaniu funkcji recvfrom nie odbiera danych pomimo tego ze klient wyslal wiadomosc a polaczenie na pewno nie zostalo przerwane.

poprosze o kazda pomoc nawet jesli mialaby to byc burza mozgow.
pozdrawiam

0

Jakiś czas temu pisałem część serwera dla wielu użytkowników. Podzieliłem owy serwer na proces "listener" (czyli proces odbierający połączenia (accept())) i procesy "obsługi klienta". Po ukończeniu wywoływania accept() ustawiane były różne zmienne, a następnie wywoływany był fork():

if(!fork()){
    obsluga_klienta();
}

Można podobnie zrobić to na pthread(), a wyglądać będzie to w następujący sposób:

pthread_create(&tid, NULL, &obsluga_klienta, NULL);

Jeżeli użyjesz metody tworzenia nowych procesów, musisz również zadbać o komunikację międzyprocesową (IPC; na linuksie: shm, pipe, semafory).

Pozdrawiam

0

no ale wlasnie tak mam. ze mam watek listener z tym accept ale chodzi mi o to ze nie moge wyjsc z tego procesu przez tego glupiego accepta. bo on sie zamienia w petle nasluchujaca do momentu az sie ktos nie zglosi i zawiesza mi ten watek przez co inne nie dzialaja

0
ryh00 napisał(a)

[...] i zawiesza mi ten watek przez co inne nie dzialaja

poczytaj sobie do czego służy wątek i jak się go obsługuje, w tym czymś czego używasz

pewnie w ogóle nie tworzysz wątków gdy accept odbierze połączenie

0

void funkcja()
{
accept()
pthread_exit()
}

int main()
{
pthread_create(pid,atrr,funcka,jakieszmienne);
pthread_join(pid)

}

i jesli wlaczy sie watek z acceptem i nie dostanie nowego polaczenia to nie wyjdzie z tego watku. jak go zmusic?

0

masz condition i muteksy

0

widze ze mnie nie rozumiecie.
potrzebuje accepta zeby sprawdzac czy sa nowe polaczenia. ale nie wiem jak przerwac dzialanie accepta.
nie moge np zrobic int a=accept(); i zrobic jakiegos warunku typu if(a==-1)pthread_exit(NULL);
bo do tego ifa dojdzie tylko w momencie jak polaczy sie nowy klient. jest jakas opcja try accept?

0
void funkcja()
{
int a = 0;
do {
a = accept();
} while ( a != -1 );
pthread_exit();
}
0

jesli chcesz udzielac pomocy, czytaj uwaznie. nic mi nie da taka petla bo nie dojdzie do lini z while zatrzyma sie w tym miejscu a=accept() i bedzie czekac az przyjdzie nowe polaczenie

0

uzyj select() albo pselect() albo w ogole stworz socket nieblokujacy

jeszcze jedno recvfrom sluzy gnazdom bezpolaczeniowym (np. udp) zas accept zdecydowanie polaczeniowym (np. tcp) byc moze powinienes uzyc samego recv jesli robisz na tcp albo porzucic akceptowanie jesli uzywasz udp

0

Nie wiem jakiego rodzaju program Ty tam tworzysz, bo Twój problem jest dla mnie niezrozumiały.
Najprostsza metoda to postawienie "listenera" w oddzielnym procesie i uruchamiać obsługę klienta w oddzielnych procesach lub jako wątki w oddzielnym procesie.

bool forkuj=true;
stworz_socket();
while(true){
    int a=accept();
    if(a==-1){
        break;
    }
    if(forkuj==true){
        if(!fork()){
            obsluga_klienta();
        }
    }else{
        uruchom_obsluge_w_innym_procesie();
    }
}

Nie rozumiem również dlaczego chcesz cały serwer umieścić w jednym procesie. Podaj jasny, przemyślany przykład zastosowania to może jeszcze będziemy Ci w stanie pomóc. Najlepiej udostępnij większą część kodu to zobaczymy co i jak.

Jeśli żaden z postów Ci nie pomógł to radzę poszukać pomocy w innym miejscu.

Pozdrawiam

0
venomxxl napisał(a)

Nie rozumiem również dlaczego chcesz cały serwer umieścić w jednym procesie. Podaj jasny, przemyślany przykład zastosowania to może jeszcze będziemy Ci w stanie pomóc. Najlepiej udostępnij większą część kodu to zobaczymy co i jak.

Jeśli żaden z postów Ci nie pomógł to radzę poszukać pomocy w innym miejscu.

Pozdrawiam

Ja z kolei nie rozumiem po co tworzyć caluteńki osobny proces zamiast rozdzielić pracę na wątki. Strata zasobów systemowych (tworzenie nowego procesu o wiele więcej cih zżera niż tworzenie wątku), strata na komunikacji (między wątkami jest wydajniejsza niż między procesami), utrudniona komunikacja (między procesami nie przekażesz wskaźnika na wspólny fragment pamięci bez użycia specjalnych metod mapowania). Jedynie jeśli nie umiemy korzystać z wątków to fork jest wygodny do prostych programów ...

0

dzieki wszystkim za pomoc
faktycznie wystarczylo ustawic soket na o_nonblock
a tutaj funkcja ktora jest bardzo pomocna

#include <fcntl.h>
fcntl(naszSoket,F_SETFL,O_NONBLOCK);

a tutaj linki ktore wyczerpuja chyba temat komunikacji asynchronicznej
http://www.linuxpl.org/LPG/node87.html

http://www.linuxpl.org/LPG/node90.html

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