|
|
Up |
|
|
  |
Author: tomekDtomekD Date: Sep 19, 2008 04:15
Mimo że poniższa funkcja jest kropka w kropkę przepisana z książki o
programowaniu w linuxie to jest w niej błąd. W w pętli for, gdy
następuje sprawdzenie czy deskryptor jest gotowy a następnie jeżeli
to deskryptor gniazdowy stara się zaakceptować połączenie
przychodzące. I tutaj jest problem, prawdopodobnie po użyciu SELECT
funkcja ACCEPT nie blokuje, i zwraca -1 jeżeli nikt nie chcę się
połączyć. W tej funkcji nie jest to uwzględnione i z tego powodu może
się pojawić BŁĄD SEGMENTACJI gdy przekaże fd_client(-1) do makra
FD_SET. Myślałem żeby wywoływać w pętli funkcję ACCEPT dopóki nie
zwróci deskryptora ale czy to jest dobre rozwiązanie?. Czy ta funkcja
jest ok?
char run_server(struct sockaddr_un *sap)
{
int fd_skt,fd_client,fd_hwm = 0, fd;
char buf[100];
fd_set set , read_set;
size_t nread...
|
| Show full article (1.66Kb) |
|
| | 6 Comments |
|
  |
Author: RafalRafal Date: Sep 20, 2008 09:54
tomekD pisze:
> Myślałem żeby wywoływać w pętli funkcję ACCEPT dopóki nie
> zwróci deskryptora ale czy to jest dobre rozwiązanie?. Czy ta funkcja
> jest ok?
Jeśli funkcja accept zwraca -1 to znaczy że wystąpił jakiś błąd.
Wypisz ten błąd (printf("accept: %%s\n", strerror(errno))) i niech się
robi znowu select(). Nie wywołuj w pętli accept bo się zablokujesz
na tym accept.
--
Rafał
|
| |
|
| | no comments |
|
  |
Author: tomekDtomekD Date: Sep 21, 2008 04:25
Tak, błąd to invalid argument, sprawdzałem co zwracaja BIND i LISTEN,
no i sie okazało że -1. Co może być powodem. Funkcja SOCKET zwraca
prawidłowy deskryptor.
|
| |
| no comments |
|
  |
Author: tomekDtomekD Date: Sep 21, 2008 04:28
On 21 Wrz, 13:25, tomekD gmail.com> wrote:
> Tak, błąd to invalid argument, sprawdzałem co zwracaja BIND i LISTEN,
> no i sie okazało że -1. Co może być powodem. Funkcja SOCKET zwraca
> prawidłowy deskryptor.
Ano tak, za któryms razem nie usunałem pliku gniazdowego i to psuło
program. Dzieki.
|
| |
| no comments |
|
  |
Author: tomekDtomekD Date: Sep 21, 2008 05:09
Invalid Argument, powodem tego jest błąd w funkcji BIND "Addres
already in use", dziwne bo zawsze na początku daje
unlink(nazwaSocketa);.
|
| |
| no comments |
|
  |
Author: tomekDtomekD Date: Sep 21, 2008 05:29
On 21 Wrz, 14:09, tomekD gmail.com> wrote:
> Invalid Argument, powodem tego jest błąd w funkcji BIND "Addres
> already in use", dziwne bo zawsze na początku daje
> unlink(nazwaSocketa);.
Nie wiem czy to wina mojego OS, (Ubuntu) , ale gdy skróciłem nazwy
socketów wszystko zaczeło grać. Okazało sie że gdy nazwałem go dajmy
na to Socket1 to w katalogu po zakonczeniu programu zostawal plik
'So', dlatego funkcja unlink nie mogła usunac pliku Socket1 bo go
zwyczajnie tam nie było. Teraz używam krótszych nazw jest ok.
|
| |
| no comments |
|
  |
|
|
  |
Author: RafalRafal Date: Sep 21, 2008 07:16
tomekD pisze:
> On 21 Wrz, 14:09, tomekD gmail.com> wrote:
>> Invalid Argument, powodem tego jest błąd w funkcji BIND "Addres
>> already in use", dziwne bo zawsze na początku daje
>> unlink(nazwaSocketa);.
>
> Nie wiem czy to wina mojego OS, (Ubuntu) , ale gdy skróciłem nazwy
> socketów wszystko zaczeło grać. Okazało sie że gdy nazwałem go dajmy
> na to Socket1 to w katalogu po zakonczeniu programu zostawal plik
> 'So', dlatego funkcja unlink nie mogła usunac pliku Socket1 bo go
> zwyczajnie tam nie było. Teraz używam krótszych nazw jest ok.
Ach, no tak. W wołaniu bind trzecim parametrem nie powinno być
0 tylko sizeof(struct sockaddr_un).
--
Rafał
|
| |
| no comments |
|
|