当前位置: 首页 > 面试题库 >

Unix域套接字如何区分多个客户端?

丁嘉庆
2023-03-14
问题内容

TCP具有元组对(IP地址/端口/类型)来告诉另一个客户端。UDP传递客户端IP和端口。unix域如何跟踪不同的客户端?

换句话说,服务器创建一个绑定到某个路径的套接字,例如/ tmp / socket。2个或更多客户端连接到/ tmp /
socket。底层发生了什么,可跟踪来自client1和client2的数据?我想网络堆栈在域套接字中不起作用,所以内核在这里完成所有工作吗?

是否有unix域协议格式,例如IP协议格式和TCP /
UDP格式?域套接字数据报协议的格式是否发布在某处?每个Unix是否有所不同,或者类似POSIX的标准吗?

感谢您的照明。我找不到任何解释此信息的信息。每个来源都只是掩盖了如何使用域套接字。


问题答案:

如果创建PF_UNIX类型为的套接字SOCK_STREAM并接受其上的连接,则每次接受连接时,都会得到一个新的文件描述符(作为accept系统调用的返回值)。该文件描述符在客户端进程中从文件描述符读取数据并将数据写入文件描述符。因此,它的工作方式就像TCP
/ IP连接一样。

没有“
unix域协议格式”。不需要这样,因为不能通过网络连接将Unix域套接字连接到对等方。在内核中,代表您的SOCK_STREAMUnix域套接字末端的文件描述符指向一个数据结构,该数据结构告诉内核哪个文件描述符位于连接的另一端。当您将数据写入文件描述符时,内核会在连接的另一端查找文件描述符,并将数据附加到该其他文件描述符的读取缓冲区。内核不需要将数据放入带有描述其目的地的标头的数据包中。

对于SOCK_DGRAM套接字,您必须告诉内核应该接收数据的套接字的路径,并使用该路径查找该接收套接字的文件描述符。

如果在连接到服务器套接字之前(或者在使用来发送数据之前)将路径绑定到客户端套接字SOCK_DGRAM,则服务器进程可以使用getpeername(for
SOCK_STREAM)获取该路径。对于a SOCK_DGRAM,接收方可以recvfrom用来获取发送套接字的路径。

如果不绑定路径,则接收过程将无法获得唯一标识对等方的ID。至少,不是在我正在运行的Linux内核上(2.6.18-238.19.1.el5)。



 类似资料:
  • 可能还值得注意的是,我使用了的修改版本,专门为unix域填充。

  • 在下面的链接中,我试图使用-对(双向无线电) http://tim.dysinger.net/posts/2013-09-16-geting-starting-with-nanomsg.html

  • 首先我要感谢你花时间... 我在macbook中用C++创建了一个服务器套接字,在运行windows XP的不同机器中用Java创建了一个客户机/套接字。我已将端口指定为5000,但无法指定正确的主机,因此无法进行连接。当我在windows xp中使用WinSock2创建一个C++服务器/套接字时,当我使用本地主机时,连接是完美的...有什么想法吗??? 提前Thnx int main(int a

  • 我是python套接字编程的初学者,正在尝试编写一个与联网家庭自动化设备(GlobalCache GC100)接口的库 我既需要通过TCP不断监听来自该硬件的传感器状态变化事件,也需要能够在用户发起的时间发送set_state命令(trip relays),而没有明显的延迟。 我有一个循环,它执行来拾取状态更改事件。这通常会超时()并继续到下一个循环迭代,直到设备推送状态更改数据。 我是想做套接字

  • 如何处理多个客户端连接到一个服务器?我有这个logserver.java 和一个嵌入式applet,其中包含如下所示的部分代码,例如 现在的问题是,如果我在服务器上运行“Java日志服务器”,它将打开应用程序并等待输入流,如果我打开我的站点,它将开始流日志。但如果我使用其他计算机/网络再打开一个站点,第二个站点不会记录流。似乎是因为第一个仍然绑定到端口5000。 我该怎么处理?socket实际上是

  • 我有一个java服务器应用程序,可以通过与多个客户端通信。在这个通道上,客户端发送请求,服务器发送应答。现在我想添加一个功能,服务器可以将文件发送到客户端。我不想通过用于通信的套接字发送,所以在一个客户端和一个服务器之间使用更多套接字是个好主意吗?如果是,如何处理?我用过这样的东西吗? 还是有更好的办法?