最后更新:2022-04-27 23:58:46 手机定位技术交流文章
套接字编程是一种典型的网络编程技术。通过在网络中添加插座关键字, 我们可以在网络之间进行沟通 。通过收集大量数据,通过这一章节,精通Socket编程是个好主意该网页载有关于著名神的几项研究。加上自己的理解,做个总结性的文章
套接字编程是一种广泛使用的网络通信机制。
既然是一门技术,因为面向目标的方案拟订现在是规范,计算机行业的一些最伟大的神 通过抽象的概念。在现实中,反复重复的想法或实际判断导致这是一连串的通讯协议根据tcp/ip协议,提出大致的构想,根据这项协议,一些广泛的计划 公牛,这是我第一次 能够把这些不同的概念联系起来对于协定中概述的每一个概念,已经定制的界面,与其协议一一对应,这是世界历史上第一次世界看到它是一个国家的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家, 一个国家是它的国家。然后它被包成一个可调用界面供开发者使用
目前,为了改进插座程序,工程师们制造了大量的信封。归根结底,它很容易 启动插座通信链。因此,首先我们必须理解索科特的传播原则。索克特的传输只有核心才能被理解这是理解索科特发生的一切 以及这里发生的一切的唯一方法从地面上牢牢抓住
似乎用来传递信件的线条和台站,例如建议信亭,对于了解信件的内容至关重要,以便理解必须理解的tcp/ip。
TCP/IP协议不同于Iso的七个分层。这七层是基础将其重新划分,好比打扫卫生,本来有扫帚,垃圾斗,抹布,涂料,工厂等待的分层数量与OSI标准分层数量一样多。tcp/ip基于目的和功能,将扫帚,垃圾堆放场被放在了艰苦的清洁地板上。油漆包装在中等层。在最终效果层中,采用盆骨工厂。TCP/IP以同样的方式分割OSI网络模型层:基本上如下:
OSI模型:

根据TCP/IP议定书参考模型,所有TCP/IP系列议定书都分为四个抽象层次。
使用的图层包括TFTP、HTTP、SNMP、FTP、SMTP、DNS、Telnet等。
TCP,UDP是传输层。
IP、IPCMP、OSF、EIGRP和IGMP是网络层协议。
SLIP、CPLIP、PP和MTU是数据链接层协议。
每个抽象的层层似乎都建立在较低水平的服务上,服务水平更高。

通过上面的图形,由于必须提供更高一级的服务,我们有一个基本概念,即应用软件需要 tcp的传输级别服务 和ip的网络级别服务。但我们在本章将要做的是 检查插座,这是 tcpip包的一部分。就好比,我们的沟通渠道是明确的。和我们设计车站的位置一样
到目前为止,广泛了解申请与tcpip协议的关系,我们只知道插座编程 是tcp/IP在线编程。然而,在上述模式中,插座的位置在哪里?一位杰出的理论家或抽象的计算机神明提出并组织这种观点。

在应用程序传输层及其应用层之间可以找到套接字。创建了插座的抽象层 。插座抽象层接收传输层的底层。应用程序层然后可以访问套接字抽象级别 。问题又来了,在应用层、插座抽象层和传输层之间,有一个传输层。我们如何在网络层之间沟通?了解这个之前,我们还是回到原点
要了解套接字程序如何使用套接字关键字实现服务器和客户通信, 需要首先了解 tcp/ ip 交谈的方式, 然后是套接字握手 。
根据tcp/ip协议,tcp使用三种握手方式建立了tcp链接:
初始握手: 客户端试图连接到服务器, 将同步软件包发送到服务器, syn=j, 客户端进入 SYN_ SEND 状态, 等待服务器确认 。
第二个握手:当服务器进入 SYN_RECV 状态时,它会接收客户端同步软件包,并在向客户端发送 SYN 软件包( syn=k) 或 SYN+ACK 软件包时确认(ack=j+1) 。
第三手握:客户端获得服务器的 SYN+ACK 软件包, 发送服务器确认软件包 ACK (ack=k+1), 软件包发送出去, 客户端和服务器进入已建立状态, 所有三种手握都已完成 。
三次握手如下图:

3个握手 3个握手 也许3个握手 一些伟大的电脑神为3个握手设计了模型
模型图如下:

综上所述,如果我们获得上述图像,我们需要设计自己的接口,以完成上述通信的三种握手方式,以及我们需要发展哪些功能的问题。
从上面可以推断出,我们与一些一般程序员相似, 一些理论提供者为我们提供了上述图形的理论, 我们需要做的就是考虑上述图形的抽象性。
初始握手: 为了连接服务器, 客户端必须提交 syn j 套件, 因此客户端必须提供链接功能 。
第二手握手:服务器必须接受处理功能,才能接收客户提供的 syn J+1 软件包并传送软件包。
第三次握手涉及客户处理功能和服务器终端处理功能。
三次握手不过是数据传输程序而已。但是,我们需要先做一些初步工作,然后再传送。例如,会构造套接字 。为了收集某些计算资源若干资源与讨论有关。以及数据接收和传输功能等Socket的编程由几个功能界面组成。
以下是客户和服务处必须履行的职责的完整清单。


以下两个图表总结了索克特的交流概念。
不是很详细 代码能解释一切
客户端的代码:
[cpp] view plain copy
#include<winsock2.h>
#include<stdio.h>
#pragmacomment(lib,“ws2_32.lib”)
intmain()
{
/SOCKET预先检查,核查图书馆版本,以避免其他套接字版本,并采用
/WASStartup启动相关版本,WSAStartup的论点包括版本信息、具体细节和需要避免的高度。
WSACleanup 和 开始
interr;
WORDversionRequired;
WSADATAwsaData;
versionRequired=MAKEWORD(1,1);
err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息
// 验证 WSACleanup 返回值是否触发套接字协议
if(!err)
{
打印f( " Custommer 嵌入式书签" 现可用!! " );
}
else
{
printf (“ 打开客户端的嵌入单词失败!! ” );
返回0;//finish
}
产生插座关键词, 这是插座的抽象层。
/ 记住套接字函数的三个参数描述套接字所在的系统、套接字类型和其他信息。
SOCKETclientSocket=socket(AF_INET,SOCK_STREAM,0);
在/口袋编程中,界定了SOCKADD_IN结构,以保存计算机信息,如索克特系统。
/ 服务器终端计算机保存数据的端口号、 IP 地址等等
SOCKADDR_INclientsock_in;
clientsock_in.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_port=htons(6000);
/ 周期前合成的定义,在服务器终端系统中用Clitsock_in保存的某些信息的定义,
//准备完成后,该包件与远程机器连接。
这是第一次握手
connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
charreceiveBuf[100];
描述插座里的东西
recv(clientSocket,receiveBuf,101,0);
printf("%s ",receiveBuf);
/ 将数据传送到套接字
send(clientSocket,“hello,thisisclient”,strlen(“hello,thisisclient”)+1,0);
//关闭套接字
closesocket(clientSocket);
//关闭服务
WSACleanup();
return0;
}
对应的服务端的代码
[cpp] view plain copy
#include<winsock2.h>
#include<stdio.h>
#pragmacomment(lib,“ws2_32.lib”)
intmain()
{
/在安装完成后,进行了一些预科测试,包括服务启动。
WORDmyVersionRequest;
WSADATAwsaData;
myVersionRequest=MAKEWORD(1,1);
interr;
err=WSAStartup(myVersionRequest,&wsaData);
if(!err)
{
打印f( “ 打开” );
}
else
{
/ 进一步搭配
我们无法做到这一点 因为这是你第一次生孩子
return0;
}
SOCKETSERSocket=Socket (AF_INET, SOCK_STREAM,0; / 创建了一个公认的设置 。
/ 必须连接的参数, 即来自本地插座的一些信息 。
SOCKADDR_INaddr;
addr.sin_family=AF_INET;
我不知道你在说什么 阿尔德 我不知道你在说什么 Sin_addr. S -un. S_addr=htonl (INADR_ANY);//ip 地址
我不知道你指的是什么, Ardr.sin_port=htons(6,00);//绑定端口)
bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
倾听(SerSocket, 5);//第二个论点界定了可能收到的最大连接次数。
SOCKADDR_INclientsocket;
intlen=sizeof(SOCKADDR);
while(1)
{
第二握手 接受对方插座的信息
SOCKETserConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听
charsendBuf[100];
Strinf( sendBuf, 欢迎访问% stobejing, nett_tentoa( clietsocket (sin_addr) ) / 定位相关 IP 地址并在那里显示线条 。
//发送信息
send(serConn,sendBuf,strlen(sendBuf)+1,0);
[100] Buf;//收到
recv(serConn,receiveBuf,strlen(receiveBuf)+1,0);
printf("%s ",receiveBuf);
闭套套接字( 传感器) // 关闭套接字
WSACleanup () // 停止资源业务 。
}
return0;
}
(取自装饰品):
服务器端:
服务器将启动程序,并应请求提供必要的服务:
(1) 建立一个通信渠道,并通知当地东道方它准备在某一港口接受客户在得到承认的地址(例如,FTP港号可能为21)上提出的客户请求;
(2) 等待客户申请到港;
(3) 在收到客户的服务请求后,响应请求,发出响应信号。这篇文章是全球之声在线特稿的一部分。要处理客户端的这项请求,必须启动新的程序(例如,UNIX中的叉、Exec)。新程序满足了该客户的要求。没有必要回答任何其他询问。服务完成后,这一新程序和客户的通信渠道已被切断。并终止。
(4) 回到第(2)步,等待另一客户的请求。
(5)关闭服务器
客户端:
(1) 建立一个通信频道,并将其连接到服务器所在的某一港口;
(2) 向服务器发送服务请求,预期收到并收到答复,并提出新的请求.
(3) 请求完成后,通信线路被关闭和终止。
从上述进程可以明显看出:
(1) 由于客户和服务器程序的作用不平等,代码不同。
(2) 服务器程序往往开始,只要系统正常运行,服务程序就一直有效,直到正常或被迫终止为止。
制作套接字套( )
在应用程序使用套接字之前, 它必须先有一个套接字, 系统使用套接字功能来给程序提供以下格式构建套接字的工具 :
[cpp] view plain copy
该呼叫将有三个参数:af、类型和协议。af 参数表示连接区域:AF_UNIX、AF_INET、AF_NS等等。只有AF_INET得到DOS和Windows的支持。它是网际网区域。因此,地址家庭和协议家庭是相同的。参数类型指定您想要构建的套接字类型 。这里分三种:
(1) TCP 当前的索克特(SOCK_STREAM)提供稳定、连接的数据传输服务。交付数据时没有错误或重复。且按发送顺序接收。内设流量控制,防止数据溢出;数据称为字节。无长度限制。流程集是文件传输协议( FTP) 。
(2) 数据报告(SOCK_DGRAM)提供非连接服务,数据集作为独立包件传送,无虚假保证,接收顺序混乱,网络文件系统(NFS)使用数据报告包。
(3) 最初的 SOCK_RAW 接口,允许直接接触诸如IP和ICCMP等较低级别的协议,经常用来测试新的协议,以便完成或获取目前服务中安装的新设备。
参数协议指定软件包中将使用的协议。如果调用者不想指定协议,则置为0,使用默认设置的连接模式 。使用这三个参数创建组合 。并分配必要的资源,同时,它返回一个整数包号。因此,套接字 () 系统函数负责指定适用的五个分组中的“ 协议” 元素 。
绑定 () 允许您提供本地地址 。
当组成套接字 () 时, 发生下列情况 :名称空间( 地址家族) 存在 。但它没有被命名。Bind () 将套接字地址( 包括本地主机和端口地址) 绑到设置编号 。我要给插座取个名字以指定本地半相关。其调用格式如下:
[cpp] view plain copy
Socket 描述符( 套件号) s 是 Socket () 调用的一个返回且不连接的套件描述符( 套件号) 。用于插座的本地地址(名称)是参数名称。其长度可变,结构因通信领域而异。名称的长度用命名符标出 。如果没有错误发生,绑定() 产生 0 值 。否则,将返回 SOCKET_Error。
使用连接() 建立套接字连接并接受 () 。
要求这两个系统完成全面相关创建,使用连接()进行连接,并使用接受()使服务器保持等待客户程序的实际连接。
连接 () 函数有以下调用格式 :
[cpp] view plain copy
参数是您想要用来进行连接的本地合成描述符。参数名称指向显示对方设定地址结构的指针。命名符指定对方套接字地址的长度。
如果没有问题, 连接 () 返回 0。 否则, SOCKET_ ERROR 的值将被返回。 在面向链接的协议中, 呼叫导致本地系统和外部系统之间实际形成连接 。
因为地址家庭总是存在于套接字位结构的前两个字节中,所以它通过套接字 () 调用。 因此, 捆绑 () 和连接 () 不需要同意作为参数 。
被接受() 函数具有以下调用格式 :
[cpp] view plain copy
参数是当地合成环境的描述符。在使用被接受的()参数之前,应先叫人倾听() 。添加词指客户的直线地址结构。用于获取关联实体的地址。创建套接字时生成的地址家庭决定了 addr 的确切格式 。客户端线条地址的长度( 字节) 由 Addrlen 给出 。如果没有错误发生,接受 () 返回 SOCKET 类型值 。包含对收到的包件的描述。否则,返回 INVALID -SONKET 值 。
接受() 用于在服务器之间建立连接 。参数 Addr 和 Addrlen 存储客户端的地址信息 。调用前,ddr 参数对应于带有空起始值的地址结构 。和 addrlen 的初始值为 0; 执行 接受 () 后服务器正在等待从软件包编号 s 中发出的客户连接请求 。客户端连接() 功能启动连接请求 。当连接请求到达时,接受 () 指示连接队列在 Addr 和 Addrlen 中存储第一个客户指定地址和请求的长度。并产生与 s 具有相同属性的新组合数。为了处理服务器和发送请求,可以创建新的系统。
4种微调技术称为:socket()、bind()、connect()、accept(),完全可以完成一个与5美元有关的机构。Socket () 定义五人组的礼宾成员数 。它的使用与它是客户端还是服务器无关,也与它是针对连接的用户还是服务器无关。bind () 从五人组中选择本地二进制文件 。这是本地的主机地址和港口号。在服务器一侧,使用与是否连接有关。无论是否面向连接,我们需要用捆绑()来弄清楚发生了什么事情。若采用面向连接,调用约束()是不可行的,但并非不可能。然后连接 为你照顾它。若采用无连接,要获得单一地址,客户必须使用约束(b)。
监听的连接 - 听 ()
此呼叫意指连接服务器, 并显示它愿意接受连接。 在接受( ) 格式前必须先调用 Listen () :
[cpp] view plain copy
参数用于确定当地确定的和未连接的合成编号。服务器可接收请求 。积压显示连接队列请求的最大长度 。它用于限制排队申请的数量。目前允许的最大值为5。如果没有错误发生,Listen () 返回 0 值 。否则,将返回 SOCKET_Error。
在执行该呼叫期间,Listen () 可以完成尚未引用的粘结()插座所需的连接, 并确定请求的 " 积压队列 " 的长度 。
调用是服务器接收连接请求的四个阶段中的第三个阶段。 它在给溪流指定套接字( ) 和调用连接( ) 后会调用, 在接受( 接受) 之前必须调用 。
发送 () 和 recev () 是传输数据的函数 。
连接建立后,数据可以传输。发送()和 recev()是共同制度的职能。
发送( ) 请求在链接的数据报告或 ss 表示的串流单词上以以下格式传输输出数据 :
[cpp] view plain copy
参数是连接在一起的本地后缀描述符。Buff表示传送数据的缓冲区。Len 指定长度 。传输控制模式通过旗帜指定。例如,是否提交后继数据等等。如果没有错误发生,发送 () 返回传送的字节总数 。否则,将返回 SOCKET_Error。
recv() 请求在链接数据报告或 s 提供的串流单词上以下列格式接收输入数据:
[cpp] view plain copy
参数是连接在一起的合成描述。布夫是缓冲区接收输入数据的指针。Len 指定长度 。传输控制模式通过旗帜指定。例如,是否获得进一步的数据,等等。如果没有错误发生,recv () 返回收到的字节总数 。如果连接被关闭,返回0。否则,将返回 SOCKET_Error。
输入/输出输出的多重化 - 选择 ()
选择( ) 是确定一个或多个集状态的方法 。每个插座,这是指可以要求读、写或错报的数据。fd_set 结构代表为状态所请求的线索收藏 。在返回时,此结构被更新,这是第一次丈夫把孩子当作孩子对待的妇女将孩子当作孩子对待。同时,选择 () 返回符合要求的组数 。其调用格式如下:
[cpp] view plain copy
nfds 参数指定了所检查的合成描述符的范围,通常不考虑这一变量。
要检查用于读取的框架描述符设置的指针用参数readfds表示。来电者希望从中读出信息。写法参数指向要写入的加密描述符集合的指针。例外是指用于测试错误的设置。超时参数指定了选择()方法等待的时间的最大长度 。如果设置了 NULL, 则不允许使用 。选择 () 返回 fd_ set 结构中包含的合成标题的总数 。如果出现问题,则返回 SOCKET_Error。
Socket- Closesocket () 关闭插座 。
关闭插座并释放分配给它们的资源;如果 s 包含一个打开的 TCP 连接,则关闭连接。
[cpp] view plain copy
如果未发生错误, 秒套() 返回 0。 否则, SOCKET_ ERROR 的结果将被返回 。
本文由 在线网速测试 整理编辑,转载请注明出处。