简单TCP通信程序的编写
工作原理
由于TCP的协议的服务,他是提供一个可靠的,面向字节流,有连接的传输服务,所以他与UDP协议是有部分不同的,但是还是右部分是相同的。具体工作的步骤如下:
1.TCP服务端通信服务的步骤:
- 创建套接字:先创建一个套接字,用于关联网卡与当前通信进程。
- 绑定地址信息:给服务端绑定地址信息(1.告诉系统收到的哪些数据应该交由当前socket 。2.发送数据到指定的源端地址信息)
- 开始监听:告诉系统当前的套接字可以开始处理连接的请求了。
注意:如果说当前套接字的状态是不可处理连接的请求状态(没有处于listen状态),那么就算是现在有客户端请求连接,那么此时也会被丢弃掉。
如果说,系统当前处于listen状态,那么就会建立连接。服务端会给每个客户端创建一个新的套接字,与指定的客户端进行后续的数据通信。 - 获取新建连接操作句柄:因为服务端会给每个连接成功的客户端创建一个新的套接字,这个新的套接字会只与这个客户进行通信,所以需要返回这个套接字的新的操作句柄。
- 收发数据:不用指定对端地址了,因为新建的套接字只与固定的客户端进行连接,所以新建套接字有完整的五元组。
- 关闭套接字:释放资源。
2.TCP客户端通信的操作步骤:
- 创建套接字:用来关联网卡与当前进程。
- 地址绑定信息:不推荐给客户端绑定地址信息。
原因:
①:一个端口只能被一个进程使用,一旦主动绑定固定端口则客户端程序只能运行一个。
②:一旦端口出现冲突(要绑定的端口已经被别人绑定了),那么绑定就会失败。
③:就算不主动绑定,在发送数据的时候,系统也会进行自动绑定合适的地址。
④:客户端在使用什么地址发送数据给客户端其实并不重要,重要的是与其进行通信。 - 发送数据。
- 接收数据。
- 关闭套接字。
函数接口
TCP通信程序的函数接口和UDP通信程序的函数接口有相同的也有不同的,如下:
1.创建套接字:int socket(int domain,int type,int protocal);
其中:
-
domain:地址域类型,由于我们目前学习是IPV4地址域类型,所以填写AF_INET。
-
type:数据传输方式,因为是TCP协议的通信,所以需要的可以提供面向字节流,可靠的,基于连接的流式套接字,所以填写SOCK_STREAM。
-
protocal:协议类型,对于tcp协议,应该传,IPPORTO_TCP进去,但是我们在type参数上已经传给了流式套接字,所以可以默认写0,在流式套接字类型上,0默认表示为tcp协议。
返回值:成功返回操作句柄,失败返回-1&