Witam znalazłem przykładowy kod serwera i klienta w pewnym pdfie (zaznaczam, iż nie jest to moj program, lecz zapozyczony, jedynie w celu nauki). Jestem w tym zielony (zwlaszcza ze zaczynam prace z Ubuntu), i chciałbym po prostu sprawdzić jak działa stworzony program, jednak po probie wyslania pakietu do serwera w terminalu wyswietla sie blad: Bad file descriptor.
Czy mógłby mi pomoc ktos pomóc, kto miał do czynienia z programowaniem sieciowym?
serwer:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
void blad()
{
perror("Blad serwera. test1 tworzenie gniazda socket");
exit(1);
}
void blad1()
{
perror("Blad serwera. Blad przy bind/n");
exit(1);
}
void blad2()
{
perror("Blad serwera. Przy nasluchiwaniu/n");
exit(1);
}
void blad3()
{
perror("Blad serwera.Przy czytaniu read \n");
exit(1);
}
void blad4()
{
perror("Blad serwera.Przy odpisywaniu /n");
exit(1);
}
int main()
{
    int gniazdo_serwera;
    int gniazdo_dla_klienta;
    int serwer_dlugosc;
    int klient_dlugosc;
    int test1,test2,test3,test4,test5;
    char znak;
    struct sockaddr_un adres_serwera;
    struct sockaddr_un adres_klienta;
    //Usuniecie starego gniazda
    unlink("gniazdo_serwera");
    //Utworzenie gniazda serwera
    test1=gniazdo_serwera=socket(AF_UNIX, SOCK_STREAM,0);
    if (test1==-1) blad();
    //Zwiazanie gniazda serwera z adresem
    adres_serwera.sun_family=AF_UNIX;
    strcpy(adres_serwera.sun_path,"gniazdo_serwera");
    serwer_dlugosc=sizeof(adres_serwera);
    test2=bind(gniazdo_serwera,(struct sockaddr *)&adres_serwera,serwer_dlugosc);
    if (test2==-1) blad1();
    //Utworzenie kolejki dla oczekujacych polaczen
    test3=listen(gniazdo_serwera,5);
    if (test3==-1) blad2();
    printf("Serwer nasluchuje...\n");
    bool q=true;
    //Komunikacja gniazda serwera z gniazdem klienta
    while(1)
    {
        //Przyjęcie polaczenia przez gniazdo serwera
        gniazdo_dla_klienta=accept(gniazdo_serwera,(struct sockaddr *)&adres_klienta,(socklen_t *)&klient_dlugosc);
        test4=read(gniazdo_dla_klienta,&znak,2);
        if (test4>0) printf("Odebralem do klienta znak %c.\n",znak);
        else blad3();
        znak='b';
        test5=write(gniazdo_dla_klienta,&znak,1);
        if (test5>0) {printf("Wysylam dane do klienta znak %c.\n",znak);q=false;}
        else blad4();
        if(!q)close(gniazdo_dla_klienta);
    }
    close(gniazdo_serwera);
    exit(0);
}
//klient
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
void blad()
{
perror("Blad klienta. Tworzenie gniazda socket");
exit(1);
}
void blad2()
{
perror("Blad klienta. Laczenie connect");
exit(1);
}
void blad3()
{
perror("Blad klienta. komunikacja write");
exit(1);
}
void blad4()
{
perror("Blad klienta. komunikacja read");
exit(1);
}
int main()
{
int gniazdo_klienta;
int serwer_dlugosc;
char znak;
int test1,test2,test3,test4,test5;
struct sockaddr_un adres_serwera;
//Utworzenie gniazda klienta
test1=gniazdo_klienta=socket(AF_UNIX, SOCK_STREAM,0);
if (test1==-1) blad();
//Ustalenie adresu serwera
adres_serwera.sun_family=AF_UNIX;
strcpy(adres_serwera.sun_path,"gniazdo_serwera");
serwer_dlugosc=sizeof(adres_serwera);
//Polaczenie gniazda klienta z gniazdem serwera
test1=connect(gniazdo_klienta,(struct sockaddr *)&adres_serwera,serwer_dlugosc);
if (test1==-1) blad2();
znak='a';
//Komunikacja gniazda serwera z gniazdem klienta
test4=write(gniazdo_klienta,&znak,1);
if (test4>0) printf("Wyslalem do serwera znak %c.\n",znak);
else blad();
test5=read(gniazdo_klienta,&znak,1);
if (test5>0) printf("Otrzymalem do serwera znak %c.\n",znak);
else blad();
close(gniazdo_klienta);
exit(0);
}