网络编程复习(TCP)----和服务器说 hello!

1.什么是TCP?

TCP是一种传输控bai制协议,是面向连接的、可du靠的、基于字节流zhi之间的传输层通信协dao议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,TCP完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。

在因特网协议族(Internet protocol suite)里面,TCP层是在IP层上面,应用层下面的一个中间层。不同主机的应用层之间经常会要用到可靠的、像管道一样的连接,但是IP层不会提供这样的流机制,而是提供不可靠的包交换。
在这里插入图片描述

2.TCP能干嘛?

TCP建立连接bai之后,通信双方都同时可以进行数据的du传输,其次,他是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。

1、聊天消息传输、推送

2、单人语音视频聊天

3、几乎UDP能做的都能做,但要考虑复杂性、性能问题。

4、TCP无法进行广播多播的操作。

5、无法搜索,搜索只能UDP来做

3.TCP的实现过程

tcp服务器

创建套接字描述符(协议)socket()

// 创建套接字描述符(协议)
  socketID = socket( PF_INET, SOCK_STREAM, 0 );
```c
绑定自己的地址(ip+port)bind() 

bind(socketID, (struct sockaddr *)&addr, addrLength )

 建立监听 listen()	
```c
listen(socketID, 10)

接受连接 accept()

newID = accept( socketID, (struct sockaddr *)&addr, &addrLength );

通信 read()/write()

read(newID, buf, SIZE - 1)

关闭套接字描述符close()

// 关闭套接字描述符
   close(newID);
   close(socketID);

在这里插入图片描述

tcp客户端

创建套接字描述符(协议)socket()

socketID = socket( PF_INET, SOCK_STREAM, 0);

//绑定自己的地址(ip+port)bind()

bind(socketID, (struct sockaddr *)&addr, addrLength)

设置对方的地址(ip+port)

//设置对方的地址(ip+port) 
  memset(&addr, 0, addrLength);
  addr.sin_family = PF_INET;
  addr.sin_port = htons(SPORT);
  addr.sin_addr.s_addr = inet_addr(IP);

发送连接请求 connect()

connect( socketID, (struct sockaddr *)&addr, addrLength )

通信 read()/write()

write(socketID, buf, strlen(buf))

关闭套接字描述符close()

close(socketID);

在这里插入图片描述

地址重复使用
```
socket绑定了ip+port+协议,当该进程结束的时候,父进程回收资源。
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
函数功能:设置socket套接字的属性
参数:
	sockfd:是套接字描述符,也就是socket()的返回值 
	level指定控制套接字的层次.可以取三种值:
		1)SOL_SOCKET:通用套接字选项.
		2)IPPROTO_IP:IP选项.
		3)IPPROTO_TCP:TCP选项.
	optname指定控制的方式(选项的名称),与level有关 
	optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换
	optlen是optval的大小 

例:int a = 1;
	setsockopt(socketID, SOL_SOCKET, SO_REUSEADDR, &a, sizeof(a));
```
收发消息recv/send
ssize_t  recv(int  socket, void  *buffer,  size_t  length, int flags);
ssize_t  send(int  socket, void  *buffer,  size_t  length, int flags);
recv的前三个参数和read相同,send前三个参数和write相同。
recv的flags
默认为0时,它是阻塞 相当于read -- 最常用的
MSG_WAITALL,等待对方发过的数据填满buf才返回,或者当出错/断开连接/收到信号等等异常情况出现时,会返回。
MSG_DONTWAIT,它是非阻塞
send的flags
默认为0时,相当于write -- 最常用的 
MSG_NOSIGNAL 当连接异常时,别发信号
```	

4.TCP的优缺点

TCP特点是双方传输数据之前必须建立一条完整连接,就像打电话,在电话接通之前两人是无法谈话的。

优点:TCP发送的包有序号,对方收到包后要给一个反馈,如果超过一定时间还没收到反馈就自动执行超时重发,因此TCP最大的优点是可靠。

缺点:很简单,就是麻烦,如果数据量比较小的话建立连接的过程反而占了大头,不断地重发也会造成网络延迟,因此比如视频聊天通常就使用UDP,因为丢失一些包也没关系,速度流畅才是重要的

文章的最后放上完整代码的链接:tcp – 和服务器说 hello!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值