-3

我知道socket在网络程序中被广泛使用,我可以用它写代码。但我无法理解一些事情:

1. 为什么我们需要套接字?

如果是通过网络层来区分应用层程序,为什么不使用应用名称或其他唯一属性呢?

插座是标准吗?

套接字只是linux或其他操作系统中的一个结构吗?

2.socket是如何工作的?

socket有很多函数,比如bind、accept、listen、send。比如send()通过TCP发送msg到dest,它是如何发送msg到网络层的?它是否将 msg 发送到 tcp 缓冲区?网络层进程如何读取 tcp 缓冲区数据以及如何将数据发送到下层进程?

如果我使用send(int sockfd, const void *buf, size_t len, int flags)函数,第一个 arg 'sockfd' 是一个未定义的套接字,比如一个随机的 int,会导致什么结果,为什么?os进程是什么?

4

2 回答 2

3

套接字起源于伯克利(因此称为伯克利套接字),它们旨在成为通过网络进行进程间通信的“标准”抽象。

  1. POSIX 套接字是一个标准,它们基本上是原始的 Berkeley 套接字(至于接口)
  2. 该接口有很好的文档记录,它指定了例如,如果您对sockfdin 中的参数使用随机 int 会发生什么send。“以及它如何将味精发送到网络层?” 是如何实现库的问题,并且在不同的操作系统上有不同的答案。从用户的角度来看,这应该是无关紧要的。
于 2013-07-18T07:02:54.163 回答
3

在 UNIX 上,套接字是一种文件描述符。在 Windows 上,SOCKET 是一种 HANDLE。文件描述符和句柄是这些操作系统允许对资源执行各种操作(例如读取和写入)的方式。因此,网络连接被认为是由操作系统的网络服务提供的操作系统资源。

套接字 API 或多或少是标准的,尽管每个操作系统都可能提供操作系统特定的 API 以及标准 API 的操作系统特定选项。

套接字的底层实现很可能涉及到一个结构。

操作系统实现套接字 API 的方式与实现其他系统调用的方式没有太大区别。send()API 最终被转换为将数据传递到网络堆栈的系统调用。网络堆栈将管理自己的缓冲区,但send()通常会导致用户空间中的数据被复制到网络缓冲区(这与write()调用系统调用时发生的情况没有什么不同)。网络堆栈通过其代码处理数据,将其传递到不同的层(通常:套接字 -> TCP -> IP -> 以太网驱动程序)。在最低层,它类似于操作系统用来与物理设备通信的任何设备驱动程序。

当您将非套接字文件描述符传递给 时send(),我希望您得到一个错误,很可能是EBADF,EINVALENOTSOCK

于 2013-07-18T07:19:13.057 回答