2016-08-11 186 views
0

這部分一週我一直在學習unix套接字,並且我有一個關於來自客戶端應用程序的connect()調用。Linux套接字(AF_UNIX)連接()失敗

connect()函數調用BLOCKING。它會阻塞,直到服務器應用程序創建它自己的套接字,將它綁定到相同的地址並開始監聽傳入連接?

在我的客戶,我有什麼是

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

是的connect()函數調用攔截[?]

不適用於UNIX套接字。它可能會阻塞其他種類的插座(如IP插座)。

它會阻塞,直到服務器應用程序創建自己的套接字,將其綁定到相同的地址並開始監聽傳入連接?

不,你自己看到了這個 - 你有一個「沒有這樣的文件或目錄」的錯誤!很顯然,它在返回錯誤之前並未等待服務器。

+0

如果我確保客戶端只有在服務器端代碼調用bind()(並且因此地址路徑文件將存在)後纔開始執行,該怎麼辦? – Ankit

+0

當然,它也會阻止UNIX套接字,但只是很短的時間...... ;-) – alk

+1

@alk通過這種推理,所有的函數調用都被阻塞,甚至是非阻塞的。 – immibis