2012-05-02 2 views
1

Я пытаюсь использовать AF_UNIX сокетов под Mac OS X, и я сделал структуру, которая содержит некоторую информацию:Оправа не удалось подключиться к серверу

typedef struct 
{ 
    int socket; 
    int conn; 
    struct sockaddr addr; 
}socket_info; 

И я использую эти функции:

socket_info* server_init(void) 
{ 
    socket_info* result=(socket_info*)malloc(sizeof(socket_info)); 
    socklen_t length=sizeof(struct sockaddr); 
    bzero(&(result->addr),sizeof(struct sockaddr)); 
    result->socket=socket(AF_UNIX,SOCK_STREAM,0); 
    (result->addr).sa_family=AF_UNIX; 
    (result->addr).sa_len=sizeof(struct sockaddr); 
    strcpy((result->addr).sa_data,"./mysock"); 
    bind(result->socket,&(result->addr),length); 
    listen(result->socket,MAX); 
    result->conn=accept(result->socket,&(result->addr),&length); 
    return result; 
} 


socket_info* client_init(socket_info* info) 
{ 
    socket_info* result=(socket_info*)malloc(sizeof(socket_info)); 
    result->socket=socket(AF_UNIX,SOCK_STREAM,0); 
    while(connect(result->socket,&(info->addr),sizeof(struct sockaddr))==-1) 
    { 
    if(errno==ENOENT) 
    { 
     sleep(1); 
    } 
    else 
    { 
     fprintf(stderr,"Error: %d",errno); 
     free(result); 
     result=NULL; 
    } 
    } 
    return result; 
} 

И я использую их в основной:

int main(int argc, char** argv) 
{ 
    socket_info *server_info, *client_info; 
    pid_t pid; 
    int fd[2]; 
    pipe(fd); 
    pid=fork(); 
    if(pid==0) 
    { 
    char buffer[100]; 
    read(fd[0], server_info, sizeof(struct sockaddr)); 
    client_info=client_init(server_info); 
    read(client_info->socket,buffer,100); 
    printf("Messaggio ricevuto: %s",buffer); 
    } 
    else 
    { 
    const char* msg="ciao"; 
    server_info=server_init(); 
    write(fd[1],server_info,sizeof(struct sockaddr)); 
    write(server_info->socket,msg,sizeof(msg)); 
    } 
    close(fd[0]); 
    close(fd[1]); 
    return 0; 
} 

Но клиент не может подключиться: вместо этого он выводит сообщение: «Error: 61».
В чем может быть причина?

ответ

3

У вас есть два основных вопроса:

  1. У вас есть классический состояние гонки. Если клиент пытается подключиться до того, как сервер настроится на прослушивание, клиент получит сообщение об ошибке.

  2. Ваш сервер не проверяет наличие каких-либо ошибок, поэтому он может быть неисправен, и вы не знаете об этом.

В любом случае вы получите именно ту ошибку, которую вы получаете (соединение отказано).

Мои деньги находятся на первой проблеме. Если вы переверните клиент и сервер, чтобы ребенок был сервером, он, скорее всего, перейдет от «того, что не работает» к «что-то происходит». В большинстве операционных систем ребенок запускается первым, потому что он сохраняет тонну памяти и устраняет огромное количество ошибок страницы в типичном случае, когда ребенок просто вызывает exec.

Смежные вопросы