一、套接字
1.在通信过程中,套接字一定是成对出现的(插板和插座)
一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现)
网络字节序(大端模式):
小端(PC本地存储):高存高,低存低
大端(网络存储):高存低,低存高
htonl函数:本地------->网络 (IP)
htons函数:本地------->网络 (port)
ntohl函数:网络------>本地(IP)
ntohs函数:网络------>本地(port)
IP地址转换函数:
①int inet_pton(int af, const char *src, void *dst):将“点分十进制”(网络字节序) -> “二进制整数”(本地字节序)
af:AF_INET、 AF_INET6
src:IP地址(点分十进制)
dst:传出,转换后的网络字节序的IP地址
返回值:成功:1
异常:0,说明src指向的不是一个有效地址
失败:-1
②const char *inet_ntop(int af, const void *src, char *dst, socklen_t size):将“二进制整数”(本地字节序)-> “点分十进制”(网络字节序)
af:AF_INET、 AF_INET6
src:网络字节序IP地址
dst:本地字节序(string IP)
size:dst的大小
返回值:成功:dst
失败:NULL
2.sockaddr地址结构:
struct sockaddr_in addr;
addr.sin_family = AF_INET/AF_INET6
addr.sin_port = htons(9527)
int dst
addr.sin_addr.s_addr = inet_pton(AF_INET,“199.24.56.3”,(void*)&dst)
addr.sin_addr.s_addr = INADDR_ANY 取出系统中任意有效的IP地址,二进制类型
3.bind ():TCP服务器端绑定IP与port(端口)
listen():设置同时监听上线
accpet():阻塞监听客户端连接
connect():TCP客户端绑定IP与port
4.函数
①socket()函数
#include<sys/socket.h>
int socket( int domain, int type, int protocol):创建一个套接字
domain:AF_INET/AF_INET6/AF_UNIX
type:SOCK_STREAM/SOCK_DGRAM
protocol:0
返回值:成功:新套接字所对应的文件描述符
失败:-1 errno
②int bind (int sockfd,const struct sockaddraddr,socklen_t addrlen):给socket绑定一个地址结构(IP+port)
sockfd:socket函数返回值
struct sockaddr_in addr
addr.sin_family = AF_INET/AF_INET6
addr.sin_port = htons(9527)
addr.sin_addr.s_addr = INADDR_ANY
addr:(struct sockaddr)&addr
addrlen:sizeof(addr)地址结构的大小
返回值:成功:0
失败:-1 errno
③int listen(int sockfd,int backlog):设置同时与服务器连接的上限数(同时进行3次握手的客户端数量)
sockfd:socket函数返回值
backlog:上限数量,最大128
返回值:成功:0
失败:-1 errno
④int accept (int sockfd,struct sockaddr*addr,socklen_t addrlen)
sockfd:socket函数返回值
addr:传出参数,成功与服务器建立连接的那个客户端的地址结构(IP+port)
addrlen:传入传出,入:addr大小 出:客户端addr实际大小
返回值:
成功:能与服务器进行数据通信的socket的文件描述符
失败:-1, errno
⑤int connect (int sockfd,const struct sockaddraddr,socklen_t addrlen)
sockfd:socket函数返回值
addr:传入参数,服务器的地址结构
addlen:服务器的地址结构大小
返回值:
成功:0
失败:-1, errno
如果不使用bind绑定客户端地址结构,采用“隐式绑定”
5.TCP通信流程分析:
server :
- socket()
创建socket
- bind()
绑定服务器地址结构
- listen()
设置监听上限
- accept()
阻塞监听客户端连接
- read(fd)
读socket获取客户端数据
6.小–大写
toupper ()
-
write(fd)
-
close():
client:
- socket()
创建socket
- connect(); 与服务器建 立连接3. write()
写数据到socket
- read()
读转换后的数据。
5.显示读取结果
- close()