Есть две программы клиент и сервер. Почему при запуске любой из них пишется Invalid argument
/* A simple echo UNIX Domain datagram server */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> /* Новый include-файл вместо 
    netinet/in.h и arpa/inet.h */
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
int main()
{
    int sockfd;
    int clilen, n;
    char line[1000];
    struct sockaddr_un servaddr, cliaddr; /* новый 
        тип данных под адреса сокетов */
    if((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) 
    /* Изменен тип семейства протоколов */
    {
        perror(NULL);
        exit(1);
    }
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sun_family = AF_UNIX; /* Изменен тип 
        семейства протоколов и имя поля в структуре */
    strcpy(servaddr.sun_path,"BBBB"); /* Локальный 
        адрес сокета сервера – BBBB – в текущей 
        директории */
    if(bind(sockfd, (struct sockaddr *) &servaddr, 
    SUN_LEN(&servaddr)) < 0) /* Изменено вычисление 
        фактической длины адреса */
    {
        perror(NULL);
        close(sockfd);
        exit(1);
    }
    while(1) {
        clilen = sizeof(struct sockaddr_un); /* Изменено 
            вычисление максимальной длины для адреса
            клиента */
        if((n = recvfrom(sockfd, line, 999, 0, 
        (struct sockaddr *) &cliaddr, &clilen)) < 0){
            perror(NULL);
            close(sockfd);
            exit(1);
        }
        if(sendto(sockfd, line, strlen(line), 0, 
        (struct sockaddr *) &cliaddr, clilen) < 0){
            perror(NULL);
            close(sockfd);
            exit(1);
        }
    }
    return 0;
}
Листинг 15-16.5. Программа 15–16-5.c . A simple echo UNIX Domain datagram server
/* A simple echo UNIX Domain datagram client */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> /* Новый include-файл вместо 
    netinet/in.h и arpa/inet.h */
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
int main() /* Аргументы командной строки не нужны,
     так как сервис является локальным, и не нужно 
    указывать, к какой машине мы обращаемся с запросом */
{
    int sockfd;
    int n, len;
    char sendline[1000], recvline[1000];
    struct sockaddr_un servaddr, cliaddr; /* новый тип 
    данных под адреса сокетов */
    if((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) 
    /* Изменен тип семейства протоколов */
    {
        perror(NULL);
        exit(1);
    }
    bzero(&cliaddr, sizeof(cliaddr));
    cliaddr.sun_family= AF_UNIX; /* Изменен тип 
        семейства протоколов и имя поля в структуре */
    strcpy(cliaddr.sun_path,"AAAA");/* Локальный адрес 
        сокета клиента – AAAA – в текущей директории */
    if(bind(sockfd, (struct sockaddr *) &cliaddr, 
    SUN_LEN(&cliaddr)) < 0) /* Изменено вычисление 
        фактической длины адреса */
    {
        perror(NULL);
        close(sockfd);
        exit(1);
    }
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sun_family = AF_UNIX; /* Изменен тип 
        семейства протоколов и имя поля в структуре */
    strcpy(servaddr.sun_path,"BBBB"); /* Локальный адрес 
        сокета сервера – BBBB – в текущей директории */
    printf("String => ");
    fgets(sendline, 1000, stdin);
    if(sendto(sockfd, sendline, strlen(sendline)+1, 
    0, (struct sockaddr *) &servaddr, 
    SUN_LEN(&servaddr)) < 0) /* Изменено вычисление 
        фактической длины адреса */
    {
        perror(NULL);
        close(sockfd);
        exit(1);
    }
    if((n = recvfrom(sockfd, recvline, 1000, 0, 
    (struct sockaddr *) NULL, NULL)) < 0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }
    recvline[n] = 0;
    printf("%s", recvline);
    close(sockfd);
    return 0;
}