网络编程复习 --对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!