TCP协议
一、定义
TCP协议是面向连接的可靠的字节流服务
TCP协议分为客户端和服务端
服务器是被动通讯,客户端是主动通讯
二、服务器的系统调用
1、方法
(1)int socket();创建一个用于监听客户端连接的网络套接字
原型:
- int socket(int domain, int type, int protocol)
成功返回套接字的文件描述符,失败返回-1
domain:协议簇 AF_INET
type:具体的协议 SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)
protocol:默认值为0
(2)int bind();将创建的套接字与本端的地址信息进行绑定
原型:
- int bind(int sockfd,const struct sockaddr * addr, socklen_t addrlen)
成功返回0,失败返回-1
sockfd:使用socket方法创建的套接字描述符
addr:服务器程序的地址信息
addr_len:指定结构体大小
struct sockaddr_in
{
sa_family_t sin_family;
unsigned short sin_port;
struct sockaddr_t sin_addr;
}
(3)int listen();启动监听,不会阻塞
原型
- int listen(int sockfd, int backlog);
成功返回0,失败返回-1
sockfd:创建并绑定过的套接字描述符
backlog:指定内核创建的用于维护当前客户端连接(还没被accept)的队列(已完成的)大小
(4)int accept();接收一个客户端的连接,返回的是一个客户端连接套接字
原型
- int accept(int sockfd, struct sockaddr * addr,socklen_t*addrlen);
成功返回与客户端连接的文件描述符,失败返回-1
sockfd:经过listen的监听套接字
addr:用于保存接收到的客户端的地址信息
addrlen:地址结构的长度
(5)int recv/int send();读取数据或者发送数据(read()/write())
recv原型
- ssize_t recv(int sockfd, void*buf, size_t len, int flags);
send原型
- ssize_t send(int sockfd, const void*buf, size_t len, int flags);
(6)int close();关闭文件描述符(套接字)
2、伪代码
int main()
{
int listenfd = socket();
int res = bind();
res = listen();
while(1)
{
int clientLinkFd = accept();
while(1)
{
recv()/send();
}
close(clientLinkFd)
}
close(listenfd);
}
三、客户端的系统调用
1、方法
(1)int socket();创建一个用于整个通讯的套接字
(2)int connect();与服务器程序建立连接
原型
int connect(int sockfd)
成功返回0,失败返回-1
addr:服务器的地址信息
(3)int rev();/int send();读取或发送数据
(4)int close();
2、伪代码
int main()
{
int sockfd = socket();
int res = connect();//listen之后,accept之前
while(1)
{
send()/recv();
}
close(sockfd);
}