tcp
来源:互联网 发布:南京婚纱摄影软件 编辑:程序博客网 时间:2024/05/29 16:14
TCP
TCP 的编程流程:
sever(服务器端):
socket(创建一个标识)
bind(用端口号和IP地址命名)
listen(监听)
accept(接收数据)
recv/send(发送数据)
client(客户端):
socket
/*bind */(可有可无)已知服务器的名称,通讯时服务器自然就知道了客户端的名称
connect(发起连接)
recv/send(发送数据)
close
服务器端编程流程中具体的函数类型:
int socket(int domain(协议簇 AF_INET),int type(选择SOCK_STREAM(tcp)还是SOCK_DGRAM(udp)协议), int protocol(tcp下的哪个))
int bind(int sockfd (创建的套接字),const struct sockaddr*addr指定IP地址和端口号,socklen_t addrlen长度)
struct sockaddr_in{
sa_family_t sin_family;//地址簇
u_int16_tsin_port; //端口号(网络字节序,大端模式)
struct in_addrsin_addr;//IPv4
}
struct in_addr{
u_int32_ts_addr;//IP地址最终的表示
}
int listen(int sockfd,int size);//创建的套接字,创建队列的大小
创建一个文件监听描述队列
int accept(intsockfd,struct sockaddr*addr,int *addrlen)
返回值:从监听中获取到的和客户端连接的文件描述符
addr::记录客户端的IP地址和端口号
客户器端编程流程中具体的函数类型
socket send/recv close
int connect(intsockfd, struct sockaddr*addr,int addrlen)
addr::要连接的服务器的IP地址和端口号
相关代码:
//ser.c#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<assert.h>#include<sys/types.h>#include<sys/socket.h>#include<srpa/inet.h> void main(){ int sockfd = socket(AF_INET,SOCK_STREAM,0); assert(socket != -1); struct sockaddr_in ser,cli; ser.sin_family = AF_INET; ser.sin_port = htons(6000); ser.sin_addr.s_addr =inet_addr("127.0.0.1"); int res = bind(sockfd,(struct sockaddr*)&ser,sizeof(ser)); assert(res != -1); listen(sockfd,5);while(1){ int len = sizeof(cli); int c = accept(sockfd,(struct sockaddr*)&cli,&len);//从队列里取一个链接 assert(c != -1);while(1){ char buff[128]={0}; int n = recv(c,buff,127,0);if(n<=0)break; printf("recv::%s\n",buff); send(c,"i know",strlen("i know"),0);} close(c);} close(sockfd);}
//cli.c void main() { int sockfd = socket(AF_INET,SOCK_STREAM,0); assert(sockfd != -1); struct sockaddr_in ser,cli; ser.sin_family = AF_INET;ser.sin_port = htons(6000) ser.sin_addr.s_addr = inet_addr("127.0.0.1"); int res = connect(sockfd,(struct sockaddr*)&ser,sizeof(ser)); assert(res!=-1); send(sockfd,"hello world",strlen("hello world"),0); charbuff[128]={0}; recv(sockfd,buff,127,0); printf("recv::%s\n",buff); close(sockfd);}
注:
如果出现断言时出错,IP地址不对或端口号被占用(小于1024不能用,大于1024已经被占用)或无权限使用。
TCP三次握手创建连接过程
TCP四次挥手断开连接的过程
1.客户端向服务器发起FIN断开连接请求,
2.服务器端向客户端发送ACK回馈表示接收到断开连接的请求
3.如果这个时候服务器端没处理完数据,则需要一段时间处理数据,直到处理完以后才向客户端发送FIN断开连接的操作 如(1)
TCP也可能三次挥手,这种情况下服务器不需要有处理数据的时间,在向客户端发送ACK回馈时,同时发送断开连接的操作 如(2)
4.客户端接收到服务器断开连接的请求后向服务器发送一个ACK表示知道已经断开连接
- tcp
- TCP
- TCP
- tcp
- tcp
- tcp
- tcp
- tcp
- TCP
- TCP
- TCP
- tcp
- TCP
- tcp
- TCP
- TCP
- tcp
- TCP
- 一个Spring Scheduler (Quartz) 动态添加,删除,修改任务的例子
- jupyter中sklearn、opencv无法导入,python中导入正常
- 由深拷贝与浅拷贝引发的引用计数、写时拷贝技术
- hue 大数据的web工具
- NOD1024 (大数据的处理)
- tcp
- 【1701H1】【穆晨】【171115】连续第三十六天总结
- JQuery各种用法参考
- 1.ES6简介
- Hibernate关联关系映射配置(一对多,多对多,一对一)
- c++11:lambda表达式
- java练习题7
- vue-cli的构建+Vue的超级简单实例
- Uva 1649 Binomial coefficients