作者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/cn.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