[問題] unix-domain socket descriptor 請益

看板Linux作者 (沒有暱稱)時間6年前 (2019/09/24 18:04), 6年前編輯推噓1(2115)
留言18則, 6人參與, 6年前最新討論串1/1
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://www.ptt.cc/bbs/Linux/M.1569319474.A.D12.html ※ 編輯: anoymouse (211.75.14.193 臺灣), 09/24/2019 18:06:42

09/24 18:46, 6年前 , 1F
一個 server 可以有很多個 client,如果有下一個 client
09/24 18:46, 1F

09/24 18:46, 6年前 , 2F
進來,再呼叫一次 accept 就會有另外一個 cfd 出現。
09/24 18:46, 2F

09/24 18:48, 6年前 , 3F
再啦幹
09/24 18:48, 3F

09/24 19:23, 6年前 , 4F
可是新的des並沒有綁路徑 為什麼連得到?
09/24 19:23, 4F

09/24 19:55, 6年前 , 5F
路徑已經在 sfd 設定過了,而 cfd 又是從 sfd 產生出來的
09/24 19:55, 5F

09/24 19:56, 6年前 , 6F
不用再設定一次路徑其實很合理?
09/24 19:56, 6F

09/24 21:35, 6年前 , 7F
也只能這樣想 不過具體是怎麼樣不清楚
09/24 21:35, 7F

09/24 22:47, 6年前 , 8F
為什麼你覺得用同一個 fd 會 work?
09/24 22:47, 8F

09/24 23:50, 6年前 , 9F
變數名稱已經明確告訴你,accept產生的c(lient)fd是與被接
09/24 23:50, 9F

09/24 23:51, 6年前 , 10F
受連線的client一一對應.不然你server面對多個client,要
09/24 23:51, 10F

09/24 23:51, 6年前 , 11F
如何分辨誰是誰?
09/24 23:51, 11F

09/24 23:52, 6年前 , 12F
看你的描述,你應該是搞反了s和c,s(erver)fd是server這半
09/24 23:52, 12F

09/24 23:53, 6年前 , 13F
邊的代表,accept後接受某個新client後才產生對應該client
09/24 23:53, 13F

09/24 23:53, 6年前 , 14F
的cfd
09/24 23:53, 14F

09/24 23:55, 6年前 , 15F
client那半的sfd,則是指明要連線的對方server資訊(IP,por
09/24 23:55, 15F

09/24 23:55, 6年前 , 16F
t)等
09/24 23:55, 16F

09/24 23:55, 6年前 , 17F
^程式
09/24 23:55, 17F
※ 編輯: anoymouse (61.230.163.114 臺灣), 09/25/2019 01:05:43

09/28 23:29, 6年前 , 18F
不懂 socket 的話, 把 server client 分成兩隻寫比較好懂
09/28 23:29, 18F
文章代碼(AID): #1TYUeoqI (Linux)
文章代碼(AID): #1TYUeoqI (Linux)