[问题] unix-domain socket descriptor 请益

楼主: anoymouse (没有暱称)   2019-09-24 18:04:32
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?
有没有比较直观的理解?
谢谢
作者: lantw44 (#######################)   2019-09-24 18:46:00
一个 server 可以有很多个 client,如果有下一个 client进来,再呼叫一次 accept 就会有另外一个 cfd 出现。
作者: brli7848 (无理阿?)   2019-09-24 18:48:00
再啦干
楼主: anoymouse (没有暱称)   2019-09-24 19:23:00
可是新的des并没有绑路径 为什么连得到?
作者: lantw44 (#######################)   2019-09-24 19:55:00
路径已经在 sfd 设定过了,而 cfd 又是从 sfd 产生出来的不用再设定一次路径其实很合理?
楼主: anoymouse (没有暱称)   2019-09-24 21:35:00
也只能这样想 不过具体是怎么样不清楚
作者: Bencrie   2019-09-24 22:47:00
为什么你觉得用同一个 fd 会 work?
作者: bitlife (BIT一生)   2019-09-24 23:50:00
变量名称已经明确告诉你,accept产生的c(lient)fd是与被接受连线的client一一对应.不然你server面对多个client,要如何分辨谁是谁?看你的描述,你应该是搞反了s和c,s(erver)fd是server这半边的代表,accept后接受某个新client后才产生对应该client的cfdclient那半的sfd,则是指明要连线的对方server资讯(IP,port)等^程式
作者: dou0228 (7777)   2019-09-28 23:29:00
不懂 socket 的话, 把 server client 分成两只写比较好懂

Links booklink

Contact Us: admin [ a t ] ucptt.com