套接字

转载 2016年08月30日 17:08:09

套接字

  套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程。应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。

       区分不同应用程序进程间的网络通信和连接,主要有3个参数通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是 “插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

        每一个基于TCP/IP网络通讯的程序(进程)都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的端口号保留给标准应用程序,比如pop3的端口号就是110,每一个套接字都组合进了IP地址、端口、端口号,这样形成的整体就可以区别每一个套接字。关于WinSock中的套接字接发缓冲区的大小,可以通过WSA:getsockopt/setsockopt 来读取并设置。

       Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。一般一个server服务器对应很多客户端client连接,则服务器必须维护一张客户连接列表,每增加一个客户端连接服务器端都要新建一个套接字负责与新增客户端进行对话通信。

       套接字主要有两类:流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。流类型的套接字是为需要可靠连接的应用程序设计的。这些程序通常使用连续的数据流。用于这种类型套接字的协议是TCP,适合FTP这类实现。流套接字是最常用的,一些众所周知的协议如HTTP、TCP、SMTP、POP3等都是用它。

        数据报套接字使用UDP做为下层协议,是无连接的,有一个最大缓冲区大小(数据包大小的最大值)。它是为那些需要发送小数据包,并且对可靠性要求不高的应用程序设计的。与流式套接字不同,数据报套接字并不保证数据会到达终端,也不保证它是以正确的顺序到来的。数据报套接字的传输效率相当高,它经常用于音频或视频应用程序。对这些程序来说,速度比可靠性更加重要。

以下为基于Socket的C/S通信模式图:

(1)同步和异步问题

        同步方式指发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式,它是一种阻塞模式;而异步指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式,它是非阻塞模式。

 关于同步和异步,参考以下实例:

举例1:手机的通讯

手机打电话时同步,发短信是异步。

举例2:请你吃饭

同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。

异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。

举例3Windows消息处理

SendMessage同步:把一条消息投放到创建hWnd窗口的线程的消息队列中,直到消息被处理完毕才返回。

PostMessage异步:把一条消息投放到创建hWnd窗口的线程的消息队列中,不等消息被处理就立即返回。

举例4B/S交互

普通B/S模式同步:提交请求->等待服务器处理(这期间客户浏览器不能干任何其他事情)->处理完毕返回。

AJAX技术异步请求通过事件触发->服务器处理(这期间浏览器仍然可以作其他事情)->处理完毕。

(2)基于socket的C/S结构程序设计

       套接字的本质是通信过程中所要使用的一些缓冲区及一些相关的数据结构

1).服务器创建监听套接字,并为它关联一个本地地址(IP和端口Port),然后进入监听状态准备接受客户的连接请求。为了接受客户的连接请求,服务器必须调用accept函数。服务器端每接收到一个客户端连接就新建一个套接字负责与该客户会话。

2).客户端创建套接字后即可调用connect函数去试图连接服务器监听套接字。当服务器端的accept函数返回后,connect函数也返回。此时客户方使用socket函数创建的套接字clientSocket,服务器方使用accept返回的套接字serverSocket,双方就可以通信了。

(3)关于服务器端监听套接字和accept返回的新的套接字的区别

        一个连接由server_ip, server_port, client_ip, server_port唯一确定。你可用getsockname和getpeername由某个socket取得。

        关于监听套接字和accept返回的新的套接字的区别,借用以下情景说明。好比你去吃饭,饭馆门迎小姐(监听SOCKET)看到你来后和你打招呼,然后(ACCEPT)找来一个服务员小姐(NEW SOCKET)伺候你,然后守在门口继续欢迎(监听)下一个。当然门迎小姐会记录是哪一位服务员小姐招待了你;如再有新客人来,门迎小姐(同一监听SOCKET)又会安排另一位服务员小姐(NEW SOCKET)伺候。门迎小姐走了,伺候每一位客人的服务员小姐不受影响。从以上情景可知连接建立后,客户端用发出连接的那个SOCKET向服务器发数据,是发给服务器新创建的SOCKET,而不是服务器的监听SOCKET。服务器的监听SOCKET永远只是用来接受连接请求。

监听套接字与已连接套接字

监听套接字(listening socket)和已连接套接字(connected socket)之间的区别常会使很多人感到迷惑。本文简要描述一下这两者的区别。为了说明监听套接字与已连接套接字的区别,我...
  • lihao21
  • lihao21
  • 2017年03月22日 21:39
  • 1388

理解套接字和端口

1  套接字编程基础 套接字,英文为socket,是一种双向的通信端口。位于网络中的主机通过连接的套接字提供的接口进行数据传输。本节将主要介绍使用套接字进行编程的一些基本概念。 1.1  ...
  • dcx1205
  • dcx1205
  • 2015年05月30日 19:34
  • 1884

监听套接字 连接套接字的区别

摘要:对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的。它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户...
  • u011676589
  • u011676589
  • 2013年10月10日 14:39
  • 2611

套接字编程常用函数

不同协议的套接字编程(TCP套接字、UDP套接字、原始套接字等)的模型有所差异,但一般会使用到一下常用函数: #include /* See NOTES */ ...
  • Windeal
  • Windeal
  • 2016年03月16日 21:46
  • 880

计算机网络之套接字SOCKET

当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口。此接口再将控制权传递给计算机的操作系统。操作系统将此调用转给某个内部过程,并执行所请求的操作。内部过程一旦执行完毕,控制权就又通过...
  • u012152619
  • u012152619
  • 2015年09月26日 12:37
  • 2500

流式套接字(TCP)、数据报套接字(UDP)

套接字是网络通信的基本构件,提供了不同主机间进程双向通信的端点。如果电话,只有当一方拨通另一方时,双方才能建立对话。通过套接字编程,程序可以跳过复杂的网络底层协议和结构,直接编制与平台无关的应用程序。...
  • MouXiaoxiong
  • MouXiaoxiong
  • 2016年08月09日 10:25
  • 4098

基于原始套接字编程

基于原始套接字编程        在开发面向连接的TCP和面向无连接的UDP程序时,我们所关心的核心问题在于数据收发层面,数据的传输特性由TCP或UDP来保证:        也就是说,对于T...
  • u013286409
  • u013286409
  • 2015年09月06日 16:23
  • 1245

原始套接字的初始化及收发流程分析

这篇文章写的很棒http://biancheng.dnbcw.info/linux/430376.html
  • hello_programmer
  • hello_programmer
  • 2015年02月12日 11:25
  • 1589

Linux下套接字详解(二)----套接字Socket

在前面我们讲了TCP/IP、TCP和UDP的一些基本知识,但是协议只有一套,而我们系统多个TCP连接或多个应用程序进程必须通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算...
  • gatieme
  • gatieme
  • 2015年06月02日 19:59
  • 8569

套接字中send和recv函数详解

recv 和send的前3个参数等同于read和write。 flags参数值为0或:   flags 说明 recv send  MSG_D...
  • zhubosa
  • zhubosa
  • 2014年07月30日 11:12
  • 3308
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:套接字
举报原因:
原因补充:

(最多只允许输入30个字)