2016-08-11 2 views
0

В эту недельную неделю я узнал о сокетах unix, и у меня есть вопрос о вызове connect() из клиентского приложения.Linux Socket (AF_UNIX) Connect() Fail

Является ли вызов функции connect() BLOCKING. Будет ли он BLOCK до тех пор, пока серверное приложение не создаст свой собственный сокет, привяжет его к тому же адресу и начнет прослушивать входящие соединения?

В моем клиенте, то, что у меня есть

printf(" abc %s\n", bind_path); 
if((retval = connect(sh->sock_fd, (const struct sockaddr*)&sadr, sizeof(struct sockaddr_un))) == -1) 
{ 
     perror("123"); 
     return SOCKET_ERROR; 
} 
return SOCKET_OK; 

И что я получаю,

[email protected]:~/Desktop/week2_3_tasks/ipc_socket_exercise$ ./user_application_proc2_client.out 
**** Process 2 (Client) Started 
**** Process 2 PID : 7106 
/tmp/sock_10 
**** Socket connected successfully with handle 3 
abc /tmp/sock_10 
123: No such file or directory 
**** Error connnecting socket to address .. exiting 

ответ

2

ли подключения() вызов функции БЛОКИРОВКА [?]

Не для сокетов UNIX. Он может блокировать другие типы сокетов (например, IP-разъемы).

Будут ли они БЛОКИРОВАТЬ, пока серверное приложение не создаст свой собственный сокет, привяжет его к одному и тому же адресу и начнет прослушивать входящие соединения?

Нет. Вы сами это видели - у вас есть ошибка «такого файла или каталога»! Очевидно, что он не дождался сервера, прежде чем он вернет эту ошибку.

+0

Что делать, если клиент запускает выполнение только после того, как код на стороне сервера вызвал bind() (и, следовательно, файл пути адреса будет существовать)? – Ankit

+0

Уверен, что он будет блокировать и для UNIX-сокетов, но только на очень короткое время ... ;-) – alk

+1

@alk По этой причине все вызовы функций блокируют, даже неблокирующие. – immibis