运输层协议概述
TCP: ==传输控制协议==面向连接,==可靠==的数据传输协议。
UDP: ==用户数据报协议==无连接,==不可靠==的数据的数据传输协议
IP: 尽力而为交付服务
函数API
接收端_server
socket()套接字
1 |
|
- domain:
- AF_INET // IPV4
- AF_INET6 // IPV6
- AF_LOCAL // 本地
- AF_ROUTE // 路由
- type:
- SOCK_STREAM // TCP
- SOCK_DGRAM // UDP
- SOCK_PACKET
- SOCK_SEQPACKET
- protocol:
- IPPROTO_TCP
- TPPROTO_UDP
- IPPROTO_TIPC
- 一般为0
- Return Value:
- 成功为新的文件描述符,否则-1
bind()帮定IP和端口
1 |
|
- sockfd:
- 是调用socket()返回的文件描述符
- addr:
- 是指向数据结构struct sockaddr 的指针,它保存你的地址(即端口和IP地址)信息
- addrlen:
- 设置sizeof(struct sockaddr)
- Return Value:
- -1 出错
- 0 没出错
socket相关的结构体
1 |
|
与sockaddr相关的函数
1 |
|
主机字节序&网络字节序
主机字节序:就是我们平常说的大端和小端模式
- 小端模式:低位字节排放在内存的底地址端,高位字节排放在内存的高地址端
- 大端模式:高位字节排放在内存的底地址端,低位字节排放在内存的高地址端
网络字节序:4个字节的32bit值以下面的次序传输:首先是07bit,最后是2431bit
查看本机是大端模式还是小端模式
1 |
|
可以复制自己电脑测试,我是小端!
linsten()监听socket
1 |
|
- sockfd 是调用socket()返回的套接字文件描述
- backlong 是在进入队列中允许的连接数目
- Return Value 发生错误返回-1,否则返回0
accept()接受连接
1 |
|
accept()用来从sockfd上返回一个新的连接:
- 第一个参数sockfd必须是经由socket(), bind(), listen()函数处理后的socket
- 第二个参数是一个地址,将保存对端地址到该地址中
- 第三个参数是地址长度的地址
Return Value:
- 如果==成功==返回的是一个==新的sockfd==,原来的sockfd依然可以用accept
- 如果失败,则返回-1
发送端_Client
connect()建立连接
1 |
|
- sockfd: 是系统调用socket() 返回的套接字文件描述
- addr:是保存着==目的端口和IP地址==的数据结构 struct sockaddr.
- addrlen: 设置为sizeof(struct sockaddr)
- Return Value: 错误返回-1,否则返回0
connect和accept是一对,分别在客户端和服务执行,在此期间,完成了三次握手操作
send()发送数据
1 |
|
- sockfd:是你想发送数据的套接字描述符
- msg: 是你想发送的数据指针
- len: 是数据的长度
- flags 设置0即可
- ==sendtop==:主要用在UDP通信中
- dest_addr:为远端要通信的网络地址
- addlen: 为地址的长度
- Return Value: 成功发送的字节数,错误则返回-1,并设置errno
recv()接收数据
1 |
|
- sockfd:是要读的套接字描述符
- buf: 是要读的信息缓冲区
- len: 是缓冲的最大长度
- flags: 可以设置为0
- Return Value: 实际读入缓冲的数据的字节数。在出错的时候返回同时设置==errno==
close()关闭连接
1 |
|