作者anoymouse (沒有暱稱)
看板Linux
標題[問題] unix-domain socket descriptor 請益
時間Tue Sep 24 18:04:32 2019
The Linux Programming Interface
裡面講解在同一個host 兩個processes用socket通訊,
Server:
.....略
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un));
cfd = accept(sfd, NULL, NULL);
while ((numRead = read(cfd, buf, BUF_SIZE)) > 0)
Client:
connect(sfd, (struct sockaddr *) &addr,sizeof(struct sockaddr_un));
write(sfd, buf, numRead);
accept()會回傳cfd這個新的descriptor來跟client的sfd進行連線。
想請問為什麼server端的sfd不能同時listen跟read/write,一定要在產一個新的cfd?
有沒有比較直觀的理解?
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.75.14.193 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Linux/M.1569319474.A.D12.html
※ 編輯: anoymouse (211.75.14.193 臺灣), 09/24/2019 18:06:42
1F:→ lantw44: 一個 server 可以有很多個 client,如果有下一個 client 09/24 18:46
2F:→ lantw44: 進來,再呼叫一次 accept 就會有另外一個 cfd 出現。 09/24 18:46
3F:噓 brli7848: 再啦幹 09/24 18:48
4F:→ anoymouse: 可是新的des並沒有綁路徑 為什麼連得到? 09/24 19:23
5F:→ lantw44: 路徑已經在 sfd 設定過了,而 cfd 又是從 sfd 產生出來的 09/24 19:55
6F:→ lantw44: 不用再設定一次路徑其實很合理? 09/24 19:56
7F:→ anoymouse: 也只能這樣想 不過具體是怎麼樣不清楚 09/24 21:35
8F:→ Bencrie: 為什麼你覺得用同一個 fd 會 work? 09/24 22:47
9F:推 bitlife: 變數名稱已經明確告訴你,accept產生的c(lient)fd是與被接 09/24 23:50
10F:→ bitlife: 受連線的client一一對應.不然你server面對多個client,要 09/24 23:51
11F:→ bitlife: 如何分辨誰是誰?09/24 23:51
12F:→ bitlife: 看你的描述,你應該是搞反了s和c,s(erver)fd是server這半09/24 23:52
13F:→ bitlife: 邊的代表,accept後接受某個新client後才產生對應該client09/24 23:53
14F:→ bitlife: 的cfd09/24 23:53
15F:→ bitlife: client那半的sfd,則是指明要連線的對方server資訊(IP,por09/24 23:55
16F:→ bitlife: t)等09/24 23:55
17F:→ bitlife: ^程式09/24 23:55
※ 編輯: anoymouse (61.230.163.114 臺灣), 09/25/2019 01:05:43
18F:推 dou0228: 不懂 socket 的話, 把 server client 分成兩隻寫比較好懂 09/28 23:29