2013-07-18 43 views
-2

我知道套接字在网络程序中被广泛使用,我可以用它编写代码。但我不明白一些事情:什么是套接字的定义,为什么需要它以及它是如何工作的?

1.为什么我们需要插座?

如果它被网络层用来区分应用层程序,为什么不使用appliation名称或其他uniqueue属性?

套接字是标准吗?

套接字只是在Linux或其他操作系统的结构?

2.套接字如何工作?

围绕套接字有很多功能,例如bind,accept,listen,send等。例如,send()通过TCP发送msg给dest,以及它如何发送msg给网络层?它发送消息到TCP缓冲区吗?网络层进程如何读取tcp缓冲区数据以及如何将数据发送到较低层进程?

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

+0

这对SO来说太宽泛了。我建议你阅读“Unix网络编程”这本书,它很好地解释了它。 – Barmar

+3

你为什么试图将所有关于套接字的问题都塞进这个问题?此外,这些问题并不表示出诚意的尝试,以便您首先回答自己的问题。 – jxh

回答

3

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

  1. POSIX套接字是一个标准,他们是,基本上原来的Berkeley套接字(作为接口)
  2. 接口是非常有据可查的,它指定如果,例如,您使用会发生什么sendsockfd参数的随机int。 “以及它如何发送消息到网络层?”是图书馆如何实施的问题,在不同的操作系统上有不同的答案。从用户角度来看,这应该是没有关系的。
3

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

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

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

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

当你传递一个非套接字文件描述符send(),我希望你得到一个错误,要么EBADFEINVAL,或ENOTSOCK,最有可能的。

相关问题