
- 外文名
- socket [1]
- 类 型
- 流式套接字、数据报套接字和原始套接字 [3]
- 作 用
- 完成两个应用程序之间的数据传输 [3]
- 中文名
- 套接字 [1]
- 实 质
- 两个网络各自通信连接中的端点 [2]
- 学 科
- 计算机网络 [1]
-
套接字
2016-01-13 09:58:00源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。 分类: 常用的TCP/IP协议的3种套接字类型如下所示。 流套接字(SOCK_STREAM): 流套接字用于提供...源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。分类:常用的TCP/IP协议的3种套接字类型如下所示。流套接字(SOCK_STREAM):流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。数据包套接字(SOCK_DGRAM):数据包套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据包套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。原始套接字(SOCK_RAW):原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。简介:套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。非常非常简单的举例说明下:Socket=Ip address+ TCP/UDP + port。连接方式:应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题主要参数:区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是 “插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系。此后,应用程序送给Socket的数据,由Socket交给网络驱动程序向网络上发送出去。计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。分类介绍:Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。假设在网络中添加第三个主机Host C,那么Host A怎么知道信息被正确传送到Host B而不是被传送到Host C中了呢?基于TCP/IP网络中的每一个主机均被赋予了一个唯一的IP地址,IP地址是一个32位的无符号整数,由于没有转变成二进制,因此通常以小数点分隔,如:198.163.227.6,正如所见IP地址均由四个部分组成,每个部分的范围都是0-255,以表示8位地址。值得注意的是IP地址都是32位地址,这是IP协议版本4(简称Ipv4)规定的,目前由于IPv4地址已近耗尽,所以IPv6地址正逐渐代替Ipv4地址,Ipv6地址则是128位无符号整数。假设第二个程序被加入的网络的Host B中,那么由Host A传来的信息如何能被正确的传给程序B而不是传给新加入的程序呢?这是因为每一个基于TCP/IP网络通讯的程序都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的端口号保留给标准应用程序,比如pop3的端口号就是110,每一个套接字都组合进了IP地址、端口、端口号,这样形成的整体就可以区别每一个套接字。Sockets:流式套接字本文描述流式套接字,它是两种可用的 Windows Sockets 类型中的一种。(另一种类型是数据文报套接字 。)流式套接字提供没有记录边界的数据流:可以是双向的字节流(应用程序是全双工:可以通过套接字同时传输和接收)。可依赖流传递有序的、不重复的数据。(“有序”指数据包按发送顺序送达。“不重复”指一个特定的数据包只能获取一次。)这能确保收到流消息,而流非常适合处理大量数据。网络传输层可将数据拆分为分组或若干个大小适当的数据包。 CSocket 类将为您处理打包和解包。流基于显式连接:套接字 A 请求与套接字 B 建立连接;套接字 B 接受或拒绝此连接请求。打电话的情况与流非常相似:正常情况下,接听方听到您的话和您讲话时的顺序一样,没有重复和遗漏。流套接字适合文件传输协议(FTP) 这类实现,此协议有利于传输任意大小的 ASCII 或二进制文件。如果必须保证数据送达而且数据大小很大时,流式套接字优于数据文报套接字。有关流式套接字的更多信息,请参见 Windows Sockets 规范。该规范可在 Platform SDK 中获得。MFC 示例 CHATTER 和 CHATSRVR 都使用流式套接字。这些示例可能已经设计为使用数据文报套接字向网络上的所有接收套接字广播。而目前的设计更好,这是因为:广播模型受制于网络“洪水”(或“风暴”)问题。后来采用的客户端-服务器模型更有效。流式模型提供可靠的数据传输,数据文报模型则未提供。最终模型利用在 CArchive 类借给 CSocket 类的 Unicode 和 ANSI 套接字应用程序之间通信的能力。注意:如果使用 CSocket 类,则必须使用流。如果将套接字类型指定为 SOCK_DGRAM ,则 MFC 断言失败Windows Sockets 示例列表下列 MFC 示例程序阐释了 Windows Sockets 功能:CHATTERCHATTER 是一个 Windows 套接字客户端示例应用程序。它是一个具有拆分窗口的单文档界面 (SDI) 应用程序,允许用户将消息发送到讨论服务器 (CHATSRVR),讨论服务器然后将消息同时发送给其他多个 CHATTER 用户。通过使 CHATTER 应用程序向服务器发送广播数据文报包而不是消息流,可以在不使用客户端/服务器模型的情况下编写 CHATTER 和 CHATSRVR。然而,与流式套接字不同,数据文报套接字不能保证一定会被传送;因此,一些消息可能不会到达讨论中的所有其他用户。运行实例:生成并运行 CHATTER 示例打开解决方案 chatter.sln。在“生成”菜单上单击“生成”。在“调试”菜单上单击“开始执行(不调试)”。运行 CHATTER 时,有一个“Setup”对话框请求输入以下内容:Handle用来寻址所有消息的名称。例如,可以选择“”。发送的所有消息的前面都会自动加上名称“”。Server运行 CHATSVR 示例的计算机的 IP 地址。Channel标识要加入的讨论的数字(一台计算机可以运行多个讨论服务器)。提供了所有这些信息并单击“OK”后,主应用程序窗口随即出现。若要发送消息,请在下部窗格中键入消息。按 ENTER 键发送消息。若要发送多行消息,请按 CTRL+ENTER 键。关键字示例:此示例说明了以下关键字:AfxGetApp、AfxMessageBox、CArchive::Flush、CArchive::IsStoring、CControlBar::EnableDocking、CControlBar::GetBarStyle、CControlBar::SetBarStyle、CDialog::DoModal、CDocument::DeleteContents、CDocument::GetFirstViewPosition、CDocument::GetNextView、CDocument::OnNewDocument、CEditView::GetEditCtrl、CEditView::SerializeRaw、CFrameWnd::DockControlBar、CFrameWnd::EnableDocking、CFrameWnd::OnCreateClient、CFrameWnd::SetActiveView、CObject::AssertValid、CObject::Dump、CObject::IsKindOf、CObject::Serialize、CRect::Size、CSplitterWnd::CreateView、CSplitterWnd::GetPane、CStatusBar::Create、CStatusBar::SetIndicators、CString::GetBuffer、CString::GetLength、CString::IsEmpty、CString::LoadString、CString::ReleaseBuffer、CToolBar::Create、CToolBar::LoadBitmap、CToolBar::SetButtons、CView::GetDocument、CView::OnDraw、CWinApp::AddDocTemPlate、CWinApp::InitInstance、CWinApp::LoadStdProfileSettings、CWinApp::OnFileNew、CWnd::DestroyWindow、CWnd::DoDataExchange、CWnd::GetClientRect、CWnd::GetWindowText、CWnd::GetWindowTextLength、CWnd::KillTimer、CWnd::OnChar、CWnd::OnCreate、CWnd::OnTimer、CWnd::PreCreateWindow、CWnd::SetTimer、CWnd::SetWindowText、SetWindowText、rand、wsprintf注意一些示例(如此示例)尚未经过修改以反映Visual C++向导、库和编译器的变化,但仍说明了如何完成所需的任务。请参见MFC 示例CHATSRVRCHATSRVR 是 Windows 套接字服务器示例应用程序,它是一个单文档界面 (SDI) 应用程序,用于为 CHATTER 示例的客户端实现讨论服务器。通过使 CHATTER 应用程序向服务器发送广播数据文报包而不是消息流,可以在不使用客户端/服务器模型的情况下编写 CHATTER和 CHATSRVR。然而,与流式套接字不同,数据文报套接字不能保证一定会被传送;因此,一些消息可能不会到达讨论中的所有其他用户。生成并运行示例生成并运行 CHATSRVR 示例打开解决方案 chatsrvr.sln。在“生成”菜单上单击“生成”。在“调试”菜单上单击“开始执行(不调试)”。运行 CHATSRVR 时会显示一个请求输入“Channel”的“Discussion”对话框。“Channel”是标识要支持的讨论的数字(一台计算机可以运行多个讨论服务器)。提供了此信息并单击“OK”后,主应用程序窗口随即出现。关键字关键字:AfxMessageBox、CArchive::Flush、CArchive::IsStoring、CCmdUI::Enable、CCmdUI::SetText、CControlBar::EnableDocking、CControlBar::GetBarStyle、CControlBar::SetBarStyle、CDialog::DoModal、CDocument::DeleteContents、CDocument::OnNewDocument、CEditView::GetEditCtrl、CFrameWnd::DockControlBar、CFrameWnd::EnableDocking、CObject::AssertValid、CObject::Dump、CObject::Serialize、CStatusBar::Create、CStatusBar::SetIndicators、CString::GetBuffer、CString::LoadString、CString::ReleaseBuffer、CToolBar::Create、CToolBar::LoadBitmap、CToolBar::SetButtons、CView::GetDocument、CView::OnDraw、CWinApp::AddDocTemplate、CWinApp::ExitInstance、CWinApp::InitInstance、CWinApp::LoadStdProfileSettings、CWinApp::OnFileNew、CWnd::DoDataExchange、CWnd::GetWindowTextLength、CWnd::OnCreate、SetWindowText、wsprintf注意 一些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器的变化,但仍说明了如何完成所需的任务。通信:要通过Internet进行通信,至少需要一对套接字,其中一个运行在客户端,称之为ClientSocket,另一个运行于服务器端面,称为ServerSocket。根据连接启动的方式以及本地要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听、客户端请求、连接确认。服务器监听是指服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求是由客户端的套接字提出连接请求,要连接的目标是服务器端套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器端套接字提出连接请求。连接确认是当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的信息发送给客户端,一旦客户端确认了此连接,连接即可建立。而服务器端继续处于监听状态,继续接收其他客户端的连接请求。使用套接字进行数据处理有两种基本模式:同步和异步。同步模式:同步模式的特点是在通过Socket进行连接、接收、发送数据时,客户机和服务器在接收到对方响应前会处于阻塞状态,即一直等到收到对方请求进才继续执行下面的语句。可见,同步模式只适用于数据处理不太多的场合。当程序执行的任务很多时,长时间的等待可能会让用户无法忍受。异步模式:异步模式的特点是在通过Socket进行连接、接收、发送操作时,客户机或服务器不会处于阻塞方式,而是利用callback机制进行连接、接收、发送处理,这样就可以在调用发送或接收的方法后直接返回,并继续执行下面的程序。可见,异步套接字特别适用于进行大量数据处理的场合。使用同步套接字进行编程比较简单,而异步套接字编程则比较复杂。转载于:https://www.cnblogs.com/zylin/p/5126341.html
-
监听套接字与已连接套接字
2017-03-22 21:39:36监听套接字(listening socket)和已连接套接字(connected socket)之间的区别常会使很多人感到迷惑。本文简要描述一下这两者的区别。为了说明监听套接字与已连接套接字的区别,我们先来看一下套接字在连接中的含义...监听套接字(listening socket)和已连接套接字(connected socket)之间的区别常会使很多人感到迷惑。本文简要描述一下这两者的区别。
为了说明监听套接字与已连接套接字的区别,我们先来看一下套接字在连接中的含义。
从内核的角度来看,一个套接字就是通信的一个端点。一个连接由它两端的套接了地址唯一确定,这对套接字地址叫做套接字对(socket pair),由下列4元组来表示:(clientip:clientport, serverip:serverport)
其中,clientip 是客户端的IP地址,clientport 是客户端的端口,serverip 是服务器的IP地址,而 serverport 是服务器的端口。
图1:套接字对4元组示意图上图1展示了一个套接字对4元组,即一个客户端与一个服务器之间的连接。在这个示例中,客户端套接字为
128.2.194.242:51234
服务器套接字地址为
114.113.200.133:80
给定客户端和服务器地址,客户和服务器之间的连接就由下列套接字对唯一确定了:
(128.2.194.242:51234, 114.113.200.133:80)
在上面的例子中,客户端是发起连接请求的主动实体,服务器是等待来自客户端连接请求的被动实体。我们知道,
socket
函数可以创建一个套接字。默认情况,内核会认为socket
函数创建的套接字是主动套接字(active socket),它存在于一个连接的客户端。而服务器调用listen
函数告诉内核,该套接字是被服务器而不是客户端使用的,即listen
函数将一个主动套接字转化为监听套接字(下文以 listenfd 表示)。监听套接字可以接受来自客户端的连接请求。
服务器通过accept
函数等待来自客户端的连接请求到达监听套接字 listenfd,并返回一个已连接套接字(下文以 connfd 表示)。利用 I/O 函数,这个 connfd 可以被用来与客户端进行通信。上面就是监听套接字与已连接套接字的基本区别了。具体来说,监听套接字,是服务器作为客户端连接请求的一个端点,它被创建一次,并存在于服务器的整个生命周期。已连接套接字是客户端与服务器之间已经建立起来了的连接的一个端点,服务器每次接受连接请求时都会创建一次已连接套接字,它只存在于服务器为一个客户端服务的过程中。
值得指出的是,无论是监听套接字,还是已连接套接字,都是只存在于服务器端。
图2:监听套接字与已连接套接字的角色图2描绘了监听套接字和已连接套接字的角色。在第一步中,服务器调用
accept
,等待连接请求到达监听套接字 listenfd,假设该监听套接字的文字描述符为3(0,1,2已预留给标准文件使用)。在第二步中,客户端调用connect
函数,发送一个连接请求到 listenfd。第三步,accept
函数打开一个新的已连接套接字 connfd (假设套接字的文件描述符为4),在 clientfd 和 connfd 之间建立连接,并且随后返回给服务器应用程序。客户端也从connect
函数返回。此时,客户端和服务器就可以分别通过读写 clientfd 和 connfd 来回传送数据了。参考资料
《深入理解计算机系统》,第2版,机械工业出版社
-
网络套接字和本地套接字
2018-03-14 09:07:15创建套接字,返回值就是套接字的文件描述符 int socket(int domain,int type,int protocol);//创建一个套接字 //domain(域):确定通信的特性,如AF_INET--IPv4,AF_INET6--IPv6,AF_UNIX--UNIX //type:确定套接字...socket网络编程
1:网络套接字
创建套接字,返回值就是套接字的文件描述符int socket(int domain,int type,int protocol);//创建一个套接字 //domain(域):确定通信的特性,如AF_INET--IPv4,AF_INET6--IPv6,AF_UNIX--UNIX //type:确定套接字类型,如SOCKET_STREAM(流式套接字),SOCKET_SEQPACKET(报文传递) //protocol:确定type下的特定协议,一般用0,表示默认协议,TCP,UDP
将套接字与地址关联
bind(int sockfd,const struct sockaddr* addr,socklen_t len); //sockfd:由socket返回的套接字的文件描述符 //addr:地址信息 //len:地址长度
设置监听
int listen(int sockfd, int backlog);//socfd套接字文件描述符,backlog,正在请求建立连接的最大数量
等待连接
int accept(int sockfd, void *addr, int *addrlen); //sockfd:socket()创建的文件描述符 //addr,用来接收客户端传来的地址等基本信息 //addrlen:addr长度
客户端请求建立连接
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); //sockfd:客户端的socket()创建的文件描述符 //serv_addr:保存这目的端口和ip等服务器基本信息 //addrlen:serv_addr长度
断开连接(二选一)
close(sockfd);//关闭套接字,进入四次挥手阶段,只是断开当前进程和socket的连接 int shutdown(int sockfd, int how);//端口所有socket连接
2:本地套接字
UNIX域套接字
UNIX域套接字用于同一台计算机上运行的进程之间的通信。他的执行效率更高,仅仅是复制数据,并不执行协议处理,不需要添加和删除网络报头,不需要计算校验和等
只支持流式和数据报两种接口,服务是可靠的,不会丢失报文也不会出错,创建套接字
这里不用UDP和TCPint socket(int domain,int type,int protocol);//创建一个套接字 //domain(域):AF_UNIX--UNIX //type:确定套接字类型,如SOCKET_STREAM(流式套接字),SOCKET_SEQPACKET(报文传递)(其实这个参数并没有用。这里只是占了个位置) //protocol:确定type下的特定协议
bind 绑定定函数:
unlink(path)//确保之前path文件不存在,bind会创建该文件。。。如果存在这个文件不unlink,bind会失败 int bind(int socket, const struct sockaddr *address, size_t address_len);
sockaddr 此处是
struct sockaddr_un { sa_family_t sun_family; //AF_UNIX char sun_path[108]; //表示本地文件路径名,(可以为相对路径也可以为绝对路径) 分为两种一个是普通路径名(linux文件路径)必须以NULL('\0')结尾, }
客户端请求建立连接
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); //sockfd:客户端的socket()创建的文件描述符 //serv_addr:保存服务器sun_path //addrlen:serv_addr长度
服务器
#include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <strings.h> #include <string.h> #include <ctype.h> #include <arpa/inet.h> #include <sys/un.h> #include <stddef.h> #include "wrap.h" #define SERV_ADDR "serv.socket" int main(void) { int lfd, cfd, len, size, i; struct sockaddr_un servaddr, cliaddr; char buf[4096]; lfd = Socket(AF_UNIX, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sun_family = AF_UNIX; strcpy(servaddr.sun_path,SERV_ADDR); len = offsetof(struct sockaddr_un, sun_path) + strlen(servaddr.sun_path); /* servaddr total len */ unlink(SERV_ADDR); /* 确保bind之前serv.sock文件不存在,bind会创建该文件 */ Bind(lfd, (struct sockaddr *)&servaddr, len); /* 参3不能是sizeof(servaddr) */ Listen(lfd, 20); printf("Accept ...\n"); while (1) { len = sizeof(cliaddr); cfd = Accept(lfd, (struct sockaddr *)&cliaddr, (socklen_t *)&len); len -= offsetof(struct sockaddr_un, sun_path); /* 得到文件名的长度 */ cliaddr.sun_path[len] = '\0'; /* 确保打印时,没有乱码出现 */ printf("client bind filename %s\n", cliaddr.sun_path); while ((size = read(cfd, buf, sizeof(buf))) > 0) { for (i = 0; i < size; i++) buf[i] = toupper(buf[i]); write(cfd, buf, size); } close(cfd); } close(lfd); return 0; }
客户端
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <strings.h> #include <string.h> #include <ctype.h> #include <arpa/inet.h> #include <sys/un.h> #include <stddef.h> #include "wrap.h" #define SERV_ADDR "serv.socket" #define CLIE_ADDR "clie.socket" int main(void) { int cfd, len; struct sockaddr_un servaddr, cliaddr; char buf[4096]; cfd = Socket(AF_UNIX, SOCK_STREAM, 0); bzero(&cliaddr, sizeof(cliaddr)); cliaddr.sun_family = AF_UNIX; strcpy(cliaddr.sun_path,CLIE_ADDR); len = offsetof(struct sockaddr_un, sun_path) + strlen(cliaddr.sun_path); /* 计算客户端地址结构有效长度 */ unlink(CLIE_ADDR); Bind(cfd, (struct sockaddr *)&cliaddr, len); /* 客户端也需要bind, 不能依赖自动绑定*/ bzero(&servaddr, sizeof(servaddr)); /* 构造server 地址 */ servaddr.sun_family = AF_UNIX; strcpy(servaddr.sun_path,SERV_ADDR); len = offsetof(struct sockaddr_un, sun_path) + strlen(servaddr.sun_path); /* 计算服务器端地址结构有效长度 */ Connect(cfd, (struct sockaddr *)&servaddr, len); while (fgets(buf, sizeof(buf), stdin) != NULL) { write(cfd, buf, strlen(buf)); len = read(cfd, buf, sizeof(buf)); write(STDOUT_FILENO, buf, len); } close(cfd); return 0; } //注:clie.socket ,serv.socket是socket伪文件,相当于管道,实际不占空间
-
套接字有三种类型:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字
2017-07-28 18:02:181.流式套接字(SOCK_STREAM) 流式的套接字可以提供可靠的、面向连接的通讯流。如果你通过流式套接字发送了顺序的数据:“1”“2”,那么数据到达远程时候的顺序也是“1”“2”。 流式套接字可以做什么呢?你听说过...1.流式套接字(SOCK_STREAM)
流式的套接字可以提供可靠的、面向连接的通讯流。如果你通过流式套接字发送了顺序的数据:“1”“2”,那么数据到达远程时候的顺序也是“1”“2”。
流式套接字可以做什么呢?你听说过Telnet应用程序吗?听过?哦,最常用的BBS服务,以及系统的远程登陆都是通过Telnet协议连接的。Telnet就是一个流式连接。你是否希望你在Telnet应用程序上输入的字符(或汉字)在到达远程应用程序的时候是以你输入的顺序到达的?答案应该是肯定的吧。还有WWW浏览器,它使用的HTTP协议也是通过流式套接字来获取网页的。事实上,如果你Telnet到一个Web Site的80端口上,然后输入“GET网页路径名”然后按两下回车(或者是两下 Ctrl+回车)然后你就得到了“网页路径名”所代表的网页!
流式套接字是怎样保证这种应用层次上的数据传输质量呢?它使用了TCP(The Transmission Control Protocol)协议(可以参考RFC-793来得到TCP的细节)。TCP保证了你的数据传输是正确的,并且是顺序的。TCP是经常出现的TCP/IP中的前半部分。IP代表Internet Protocol(因特网协议,参考RFC-791)IP只处理网络路由。2.数据报套接字(SOCK_DGRAM)
数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。
数据报套接字(Datagram Sockets)怎样呢?为什么它叫做“无连接”?应该怎样处理它们呢?为什么它们是不可靠的?好的,这里有一些事实:
·如果你发送了一个数据报,它可能不会到达。
·它可能会以不同的顺序到达。
·如果它到达了,它包含的数据中可能存在错误。
数据报套接字也使用IP,但是它不使用TCP,它使用使用者数据报协议UDP(User Datagram Protocol可以参考RFC 768)
为什么说它们是“无连接”的呢?因为它(UDP)不像流式套接字那样维护一个打开的连接,你只需要把数据打成一个包,把远程的IP贴上去,然后把这个包发送出去。这个过程是不需要建立连接的。UDP的应用例子有:tftp, bootp等。
那么,数据包既然会丢失,怎样能保证程序能够正常工作呢?事实上,每个使用UDP的程序都要有自己的对数据进行确认的协议。比如,TFTP协议定义了对于每一个发送出去的数据包,远程在接受到之后都要回送一个数据包告诉本地程序:“我已经拿到了!(一个“ACK”包)。如果数据包发的送者在5秒内没有的得到回应,它就会重新发送这个数据包直到数据包接受者回送了“ACK”信号。这些知识对编写一个使用UDP协议的程序员来说是非常必要的。
无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能解决的,而且往往是并发服务器。套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字。
3.原始套接字
原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字。 -
网络编程—套接字基础 & 基本TCP套接字编程-基本套接字函数
2016-06-13 19:07:14套接字基础一个通用套接字地址结构sockaddr:struct sockaddr { unsigned short sa_family; //套接字的协议簇地址类型,AF_XX char sa_data[14];//存储具体的协议地址 };填充特定协议地址时使用sockaddr_instruct ... -
Dart的套接字与web套接字
2015-06-19 15:06:28套接字首先在项目中建三个dart文件,如下图main.dart中的代码如下import 'dart:io'; import 'dart:convert';main(List<String> arguments) { //绑定地址和端口,获取套接字,监听每个连接 ServerSocket.bind('... -
面向链接套接字和无连接套接字的区别
2017-07-06 20:57:11流式套接字(SOCK_STREAM):提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用... -
常见套接字类型
2020-10-18 10:08:01本地节点的路径名(Unix套接字),Unix domain sockets(UDS) CCITT X.25(X.25套接字) DARPA Internet 地址(Internet套接字),这是最具代表性、最经典的、最常用的Socket,我们经常讲的套接字也就是Internet ... -
原始套接字
2019-01-15 12:17:46协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类。 链路层原始套接字可以直接用于接收和发送链路层的MAC帧,在发送时需要由调用者自行构造和封装MAC首部。而网络层原始套接字... -
TCP套接字与UDP套接字编程
2017-05-07 14:30:55用C++和Java很容易实现socket通信,两者大同小异,注意在尝试换一种新的实现时,记得弄清两者区别。 这里简述java实现的应用层Socket通信方法,并重点分析实现的... TCP套接字(来源:计算机网络-自顶向下方法) - -
为什么基于TCP连接的服务器端有两个套接字,用accept()返回的套接字通信而不是绑定的套接字
2018-04-23 17:01:58这个套接字不能用于与客户端之间发送和接收数据。accept()接受一个客户端的连接请求,并返回一个新的套接字。所谓“新的”就是说这个套接字与socket()返回的用于监听和接受客户端的连接请求的... -
原始套接字简介
2019-04-26 21:47:56流式套接字和数据报套接字这两种套接字工作在传输层,主要为应用层的应用程序提供服务,并且在接收和发送时只能操作数据部分,而不能对IP首部或TCP和UDP首部进行操作,通常把这两种套接字称为标准套接字。... -
TCP套接字和UDP套接字可以共用相同端口号
2016-01-15 16:18:31操作系统负责把传递到内部的数据适当分配给套接字,这时就利用端口号,也就是说,通过NIC接收的数据内有端口号,操作系统正式参考此端口号把数据传输给相应端口的套接字,而套接字的类型有分为TCP面向连接的套接字和... -
socket编程流式套接字(SOCK_STREAM),数据报套接字有什么区别
2016-06-09 05:28:04sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);这三种套接字有什么区别?各什么时候用?基于TCP的socket编程是为什么采用的流式套接字 -
面向连接/无连接套接字
2017-06-01 23:42:00无论使用哪种地址家族,套接字都可以分为——面向连接的套接字和无连接的套接字 面向连接的意思是在进行通信之前必须建立起一个连接;无连接的意思是在进行通信之前不需要建立连接。 面向连接的通信提供序列化的、... -
C++中 socket 套接字连接
2018-01-26 20:41:08建立socket连接 套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。 第一步:服务器监听:...为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口 -
《unix高级环境编程》套接字——套接字选项
2014-11-21 17:36:28套接字机制有两种套接字选项接口来 -
Java 套接字
2018-01-28 11:31:40套接字(socket)为两台计算机之间的通信提供了一种机制,在 James Gosling 注意到 Java 语言之前,套接字就早已赫赫有名。该语言只是让您不必了解底层操作系统的细节就能有效地使用套接字。多数着重讨论 Java 编码... -
流式套接字(TCP)、数据报套接字(UDP)
2016-08-09 10:25:37套接字是网络通信的基本构件,提供了不同主机间进程双向通信的端点。如果电话,只有当一方拨通另一方时,双方才能建立对话。通过套接字编程,程序可以跳过复杂的网络底层协议和结构,直接编制与平台无关的应用程序。... -
ServerSocket套接字实现服务器端和Socket套接字实现客户端
2015-08-14 23:15:521.创建一个服务器套接字(ServerSocket),绑定到指定端口; 2.调用accep方法,侦听来自客户端的请求,如果客户发出的请求,则接受连接,返回通信套接字Socket; 3.调用Socket的getInputStream和getOutputStream... -
Windows套接字I/O模型之套接字模式
2013-05-05 22:15:18先来说一下为什么需要I/O模型,要解释这个问题,首先我们得了解一下套接字模式,那么什么是套接字模式,套接字模式显得有点太专业了,让人生畏,我们就来通俗一点的解释一下什么是套接字模式,模式,顾名思义就是... -
根据SOCKET套接字获得此套接字绑定的端口号
2016-05-11 18:17:23//testSocket:已经绑定了端口的套接字,这里假设不知道其绑定了哪个端口,本函数是通过该套接字反推其绑定的端口 //函数返回该套接字的端口号 int getPort(SOCKET testSocket) { sockaddr_in sockAddr; int ... -
Python 套接字编程
2018-11-13 13:00:11Python 套接字编程学习历程 1.什么是socket? Socket中文译作:套接字,socket是来建立‘通信’的基础,建立连接,传输数据‘通信端点’。 每一个套接字就是一组接口与端口的组合,用来发送或者接受信息。 socket... -
Unix域套接字
2018-07-23 15:23:40Unxi域套接字并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API就是在不同主机上执行客户/服务器通信所用的API。可以视为IPC方法之一。 UNix域提供两类套接字:字节流套接字(类似... -
Linux下套接字详解(二)----套接字Socket
2015-06-02 19:59:23为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。套接口可以说是网络编程中一个非常重要的概念,linux以文件的形式实现套接口,与套接口相应的...
-
tensorflow.zip
-
【数据分析-随到随学】量化交易策略模型
-
异常检测之集成方法
-
【数据分析-随到随学】互联网行业业务指标及行业数
-
【数据分析-随到随学】Python数据获取
-
UnitySocket异步聊天室
-
Web_开发中遇到的UTF-8以及乱码的问题总结.zip
-
Suricata的安装与基本使用
-
计算机网络端口
-
外部逆向分析平台
-
Android四大组件之Activity(四)—— 启动模式(launchMode)
-
FPGA在雷达系统设计中的应用技术研究.pdf
-
Laya 2.0 开发3D小游戏 入门教学
-
30个生涯锦囊,带你跳出迷茫,找到适合你的职业方向
-
MyBatis基础(五)动态SQL
-
Floyd算法Matlab实现
-
forward转发与redirect重定向的区别.zip
-
Scratch编程等级考试二级真题讲解(电子学会图形化编程)
-
数组
-
seata-server-1.4.0.rar