1.TCP
TCP有专门的传递保证机制,收到数据时会自动发送确认消息,发送方收到确认消息后才会继续发送消息,否则继续等待。这样的好处是传输的数据是可靠的,此外它是有连接的传输,大多数网络传输都是用的TCP。
1.1 TCP流程图
![949303e50f743f79c309318a4034aaa9.png](https://i-blog.csdnimg.cn/blog_migrate/44f91b4784cac1a8a339bf595f42f39d.jpeg)
1.2 TCP步骤分析
程序分为服务器端和客户机端,先从服务器端开始分析。
服务器端:
a. 创建socket
if (-1 == sock_fd){ fprintf(stderr,"socket error:%sa", strerror(errno)); exit(1);}
所需要头文件:
#include #include
函数格式:
int socket(int domain, int type, int protocol);
函数功能:
创建一个套接字;
domain:协议域(族),决定了套接字的地址类型,例如AF_INET决定了要用IPv4地址(32位)与端口号(16位)的组合。常见的协议族有:AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX)、AF_ROUTE等;
type:指定套接字类型,SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)、SOCK_RAW
protocol:指定socket所使用的传输协议编号,通常为0
返回值:
若成功,返回一个套接字描述符,否则返回-1;
Socket就是一种文件描述符,和普通的打开文件一样,需要检测其返回结果。
b. 设置socket
memset(&server_addr, 0, sizeof(struct sockaddr_in));//clearserver_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY:This machine all IPserver_addr.sin_port = htons(PORT_NUMBER);
设置何种协议族,设置本机IP和端口,也就有了唯一性。
c. 绑定socket
ret = bind(sock_fd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)); if(-1 == ret) { fprintf(stderr,"bind error:%sa", strerror(errno)); close(sock_fd); exit(1);}
所需要头文件:
#include #include
函数格式:
int bind(int sockfd, struct sockaddr *addr, int addrlen);
函数功能:
把套接字绑定到本地计算机的某一个端口上;
sockfd:待绑定的套接字描述符
addr:一个struct sockaddr *指针,指定要绑定给sockfd的协议地址。内容结构由前面的协议族决定。
addrlen:地址的长度
返回值:
若成功,返回0,否则返回-1,错误信息存在errno中;
d. 开始监听
r