TCPIP通信建立的过程是什么

TCPIP通信建立的过程是什么,第1张

TCP/IP通信过程,简含念陪单为,三次建立,四次断开。具体如下:

三次建立:

主机A发送SYN(seq=x)报文给主机B,主机A进入SYN_SEND状态 ;

主机B收到SYN报文,回应一个SYN(seq=y)ACK(ACK=x+1)报文,主机B进入SYN_RECV状态;

主机A收到主机B的SYN报文,回应一个ACK(ACK=y+1)报文,主机A进入established状态。

三次握高亮手完成,主机A和主机B已经建立连接。

四次断开:

某个应用进程先调用close,称该端执行“主动关闭”(active close)。该端的TCP发送一个FIN分节,表示数据发送完毕;

接收到这个FIN的对端执行“被动关闭”(passive close),这个FIN由TCP确认。

一段时间的等待后,接收到这个文件结束符的应用进程将调用close关闭它的套接字,所以它的TCP也发送一个FIN。

接收到这个最终FIN的原发送端TCP(主动要求关闭连接的那一端)确认这个FIN。

因为每个方向都谈蠢需要一个FIN和ACK,所以断开需要4个次连接。

首先要讲一下他们的一些设置(属性):

TServerSocket 的几个属性

Active

是否是工作状态,可以把它设置为ture或false来启动和停止侦听。

Port

本机侦听的端口,可以设置为一大于1024的数;

ServerType

服务端的工作方式,有两个选择,一个是stNonBlocking 非阻塞方式,一个是stThreadBlocking线程阻塞方式,默认是非阻塞方式。用非阻塞方式编程比较简单(我个人认为),用阻塞方式对每个连接必须自己用线程来控制收发。

ThreadCacheSize

缓冲的线程个数 当ServerType是stThreadBlocking时有效。

TClientSocket 的几个属性

Active

是否是工作状态,可以把它设置为ture或false来同服务端建立或断开连接。

Host

服务器(ServerSocket)的计算机名,是一个字符串

Address

服务器(ServerSocket)的IP地址

ClientType

客户端的工作方式一种是ctNonBlocking非阻塞方式,一种是ctBlocking阻塞方式,默认是非阻塞方式

Port

同服务端(ServerSocket)连接的端口,这个端口就是ServerSocket的侦听 端口

在设置ClientSocket的(Host)主机名和设置(Address)IP地址是等效的,但设主机名需要网络具有DNS(域名解析服务)服务器,而且设主机名要比设主机的IP地址连接的速度慢一些。建议用Address来同ServerSocket进行连接。

设置好所有的属性后,ServerSocket控件就可以通过将它的Active属性置为true来进行侦听了。ClientSocket可以通过设置它的Active属性来同ServerSocket进行连接。连接成让陆乱功就可以进行通讯了。在这个过程中会产生一些事件,下面说说他们各自的事件。

TServerSocket的几个事件

OnAccept

当一个客户同服务端连接成功后产生这个事件,产生这个事件后这个连接就可用了,可以对这个客户进行发送和接收数据。

OnClientConnect

当一个客户正在同服务端建立连接的时候产生此事件,在这里你可以决定是否接受这个连接。

OnClientDisconnect

当一个客户同服务端的连接断开的时候产生此事件,你需要在这里进行一些处理,如从连接列表中清除次连接释放内存等。

OnClientError

当客户同服务端出现错误时产生此事坦档件,在此事件中你可以通过设置ErrorCode = 0来屏蔽系统的错误提示。这样就可以避免讨厌的英文错误了。根据ErrorEvent的不同的值来得知发生了什么错误,它有一下几中错误类型

eeGeneral 未知错误

eeSend发送数据出现错误

eeReceive 接收数据出现错误

eeConnect 客户请求连接时出现错误

eeDisconnect 客户断开连接时出现错误

eeAccept 接受一个客户时发生错误

一般来讲,当发生错误的时候这个客户的连接就已经不可用了,要对这个客户进行连接失败处理。

OnClientRead

当服务端收到客户端发来的数据的时候产生此事件。接收客户端的数据都在这里进行。

OnClientWrite

当服务端发送数据的时候产生此事件。

TClientSocket的几个事件

OnConnect

同服务端(ServerSocket)连接成功后将产生此事件,产生此事件后才说明这个连接可用了,这时才可以向ServerSocket发送数据。

OnConnecting

正在同服务端进悉源行连接是产生此事件。

OnDisconnect

同服务端的连接断开后产生此事件,产生此事件后ClientSocket的Active属性就为false了,这时这个连接就不可用了,必须重新进行连接才能向服务器发送数据。

OnError

当Socket发生错误时产生此事件,这个事件的意义和ServerSocket的Error事件完全一样,只是它没有eeAccept错误。

OnRead

当接收到服务端发来的数据后产生此事件。

OnWrite

当向服务端发送数据的时候产生此事件。

同学您好!!!带梁单个服务器与

多个用户的通信连接,用户方面的流程是:1.新建套接字Socket

s;2.确定服务器IP地址和端口号 addr = 192.168.1.12 port =

80803.对本机地址进行显式或隐式绑定(一般采用隐式绑定故这步可以忽略)4.开启与服务瞎唤器的连接connect(s,addr)5.进行数据交

互传输 send recv6.通信结束 关闭套接字closesocket(s)

服务器方面的流程蠢神运是:1.新建套接字Socket

s;2.确定本地IP和端口号(不能隐式绑定)addr = 192.168.1.12 port =

8080;3.对本地IP和端口进行绑定bind(s,addr);4.对端口进行监听listen(s)5.接收一个连接 newsock =

accept(s)6.服务器在接收了一个连接之后,便新建一个套接字newsock,

此时要开启一个子线程来负责处理与该用户机的数据传输,而主线程继续监听端口创建新的子线程来与多个用户进行连接。C下可以采用createThread

函数,

CreateThread( NULL,0,

                          chat, //子线程函数入口

                          &newsock, //传给子线程的参数

                          0, &Tid)

然后在chat函数中进行recv和send即可


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12515134.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存