Pisze program klient-serwer echo pod Linuxem.
Bezpołączeniowo, na datagramach:
socket(AF_INET,DGRAM,0)

Programy sie kompiluja bez bledow, gdy w kliencie wpisze jakikolwiek tekst, serwer go zwroci, tak jak powinien, lecz funkcja recv() zwraca blad:
Bad file descriptor
i sie wyłącza.
Wie ktoś może jaki popełniłem bląd??

oto serwer:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>

#define SERVER_PORT 1500
#define MAX_MSG 100

int main()
{
  char line[MAX_MSG];
  int sd, n;
  socklen_t cliLen;
  struct sockaddr_in cliAddr, servAddr;
  sd = socket(AF_INET, SOCK_DGRAM, 0);
  if (sd < 0)
  {
    perror("socket");
    exit(1);
  }
  memset(&servAddr,0x0,sizeof(servAddr));
  servAddr.sin_family = AF_INET;
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servAddr.sin_port = htons(SERVER_PORT);
  if(bind(sd,(struct sockaddr*) &servAddr, sizeof(servAddr))<0)
  {
    perror("bind");
    exit(1);
  }
  for(;;)
  {
    cliLen = sizeof(cliAddr);
    memset(line,0x0,MAX_MSG);
    n = recvfrom(sd,line,MAX_MSG,0,(struct sockaddr*) &cliAddr,&cliLen);
    if(n<0)
    {
      perror("recvfrom");
      exit(1);
    }
    sendto(sd,line,n,0,(struct sockaddr*) &cliAddr,cliLen);
    close(sd);
  }
  exit(0);
}

oto klient:

#include <stdio.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>

#define MAX_LEN 100
#define SERWER_PORT 1500

int main (int argc, char **argv)
{
  if (argc!=2)
  {
    printf("Uzycie: %s adres\n",argv[0]);
    exit(1);
  }
  int len = 0, gniazdo;
  struct sockaddr_in serwer_adres;
  char cmd[MAX_LEN],odp[MAX_LEN];
  if ((gniazdo = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )
  {
    perror("socket");
    exit(1);
  }
  memset(&serwer_adres,0,sizeof(serwer_adres));
  serwer_adres.sin_family = AF_INET;
  serwer_adres.sin_addr.s_addr = inet_addr(argv[1]);
  serwer_adres.sin_port = htons(SERWER_PORT);
  struct hostent *host;
  host = gethostbyname(argv[1]);
  if (host == NULL)
  {
    printf("Nieznany host '%s'\n", argv[1]);
    exit(1);
  }
  serwer_adres.sin_family = host->h_addrtype;
  memcpy((char*) &serwer_adres.sin_addr.s_addr, host->h_addr_list[0], host->h_length);
  serwer_adres.sin_port = htons(SERWER_PORT);
  printf("> ");
  memset(odp, 0x0, MAX_LEN);
  fgets(cmd,sizeof(cmd),stdin);
  len = strlen(cmd);
  if (len > 0) cmd[len-1]=0;
  if((sendto(gniazdo, cmd, len, 0, (struct sockaddr*)&serwer_adres,sizeof(serwer_adres)))==-1)
  {
    perror("sendto");
    exit(1);
  }
  if ((len = recvfrom(gniazdo, odp, MAX_LEN, 0, NULL, NULL))==-1)
  {
    perror("recvfrom");
    exit(1);
  }
  printf("echo> %s\n",odp);
  close(gniazdo);
  exit(0);
}