什么是Socket?

21
我不太清楚socket的确切含义。服务器运行在一台特定的计算机上,并且有一个绑定到特定端口号的套接字(socket)。服务器只是等待,监听着连接请求的套接字。当服务器接受连接时,它会得到一个新的套接字,这个套接字绑定到同一本地端口,并且其远程端点设置为客户端的地址和端口。服务器需要一个新的套接字,以便在处理已连接的客户端的需求时,仍然可以继续监听原始套接字上的连接请求。

所以,套接字是在内存中创建的某个类吗?对于每个客户端连接,都会在内存中创建此类的新实例吗?套接字中写入了连接的本地端口、端口和客户端的IP地址。有人能详细解释一下套接字的定义吗?

谢谢。


我想你已经明白了... - stdcall
1
请查看http://stackoverflow.com/faq#questions。 - gprathour
1
简单来说,套接字用于服务器和客户端之间的实时数据传输。 - Chandni Soni
一个套接字是计算机网络中的一个端点,用于通过互联网或本地网络与另一个套接字进行通信。它定义了数据格式和传输控制协议,以便通信可以发生。 - Channa
5个回答

18

套接字实际上是一种文件句柄类型,其后面可以是网络会话。

您可以像处理其他文件句柄一样读取和写入它(大多数情况下),并且数据将从会话的另一端进出。

您所描述的具体操作适用于套接字的服务器端。 服务器建立(绑定到)一个套接字,该套接字可用于接受传入连接。 接受后,您会得到另一个套接字以进行已建立会话的处理,使服务器能够返回并在原始套接字上侦听更多传入连接。

它们在内存中的表示因抽象级别而异。

在C的最低级别,它们只是文件描述符,即小的整数。 但是,您可能具有更高级别的 Socket ,该类封装了底层套接字的行为。


2
更准确地说,“它的背后是一个网络会话的终点”。 - user207421
1
@paxdiablo 上面的评论? - Suraj Jain
@Suraj,如果你在问正确的术语是什么,我的想法是,无论你指定套接字(例如端点)后面的立即事物还是更集体的术语(例如会话,“另一端”,网络),它并不真正影响套接字本身 - 套接字基本上是一个句柄,用于表示与其他地方的某些连接。 - paxdiablo
@paxdiablo,您能否为我推荐一些好的资源,让我深入了解所有这些术语以及它们的工作原理? - Suraj Jain
1
@Suraj,我大部分是在大学里学习的,那已经是很久以前的事了,但我现在参考的书籍是W Richard Stevens的《UNIX网络编程》。在我看来,这本书相当不错。 - paxdiablo

7
根据Michael J. Doonahoo和Kenneth L. Calvert的《C语言TCP/IP套接字编程实践指南》(第1章,第1.4节,第7页):
套接字是应用程序通过它发送和接收数据的抽象,就像打开文件允许应用程序将数据读写到稳定存储器中一样。套接字允许应用程序“插入”网络并与也插入同一网络的其他应用程序通信。一个应用程序在一台机器上向套接字写入的信息可以被另一台机器上的应用程序读取,反之亦然。
请参考本书,从程序员的角度了解套接字以获得更清晰的概念。

3
套接字定义:
两个运行在两台计算机系统上的进程之间的通信可以通过以下关联完全指定:{协议,本地地址,本地进程,远程地址,远程进程}。我们还将半关联定义为{协议,本地地址,本地进程}或{协议,远程地址,远程进程},它们分别指定了连接的一半。这个半关联也被称为套接字或传输地址。套接字一词在伯克利Unix网络系统中得到了普及,它是“通信的一个端点”,与半关联的定义相对应。

2

2

网络套接字是在网络上运行的两个程序之间通信流的一个端点。

套接字是IP地址加端口号的组合

这是在互联网的无连接环境中,服务器处理许多客户端请求并且不保持连接时间长于即时请求服务的情况下,从服务器应用程序发出套接字请求的典型顺序:

实现步骤

在服务器端

initilize socket() 
--
bind() 
-- 
recvfrom() 
--
(wait for a sendto request from some client) 
-- 
(process the sendto request) 
--
sendto (in reply to the request from the client...for example, send an HTML file)

相应的客户端套接字请求序列将是:

socket() 
--
bind() 
--
sendto() 
--
recvfrom()

这样你就可以建立一个管道连接..更多信息请参考http://www.steves-internet-guide.com/tcpip-ports-sockets


一个本地端口可以关联多个套接字。 - rofrol
套接字远不止于 IP 地址和端口号。AF_INET 只是众多地址族之一,还有诸如 AppleTalk、DECNet、X.25 等等的大量地址族。更准确地说,它们代表任意网络端点。 - paxdiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接