网站建设小程序开发公司,网站专题方案,快速搭建网站工具,个人怎么做一个网站目录 1、tcp协议和udp协议
2、多线程并发和多进程并发#xff1a;
#xff08;1#xff09;多进程并发服务端
#xff08;2#xff09;多进程并发客户端#xff1a;
3、tcp:
4、粘包
5、UDP协议编程流程
(1)服务器端#xff1a;
(2)客户端#xff1a;
6、tcp状…目录 1、tcp协议和udp协议
2、多线程并发和多进程并发
1多进程并发服务端
2多进程并发客户端
3、tcp:
4、粘包
5、UDP协议编程流程
(1)服务器端
(2)客户端
6、tcp状态
7、tcp状态转移图 1、tcp协议和udp协议
tcp协议面向连接 可靠 流式服务
udp协议无连接 不可靠 数据报
根据场景来决定使用什么协议
2、多线程并发和多进程并发
多线程并发如果线程出现失误可能导致整个进程失败多进程互相不影响
1多进程并发服务端
#includestdio.h
#includestring.h
#includestdlib.h
#includeunistd.h
#includesys/socket.h
#includenetinet/in.h
#include arpa/inet.h
#includesignal.hint socket_init();
void do_run(int c)
{while(1){char buff[128]{0};int numrecv(c,buff,127,0);if(num0){break;}printf(child read:%s,buff);send(c,ok,2,0);}
}
int main()
{signal(SIGCHLD,SIG_IGN);//处理僵死进程 一个是忽略信号一个是wait();int sockfdsocket_init();if(sockfd-1){printf(socket err\n);exit(1);}while(1){struct sockaddr_in caddr;int lensizeof(caddr);int caccept(sockfd,(struct sockaddr*)caddr,len);if(c0){continue;}printf(c%d\n,c);pid_t pidfork();if(pid-1){close(c);continue;}if(pid0){close(sockfd);do_run(c);close(c);printf(child exit pid%s\n,getpid());exit(0);}close(c);}}
int socket_init()
{int sockfdsocket(AF_INET,SOCK_STREAM,0);if(sockfd-1){return -1;}struct sockaddr_in saddr;memset(saddr,0,sizeof(saddr));saddr.sin_familyAF_INET;saddr.sin_porthtons(6000);saddr.sin_addr.s_addrinet_addr(127.0.0.1);int resbind(sockfd,(struct sockaddr*)saddr,sizeof(saddr));if(res-1){return -1;}reslisten(sockfd,5);if(res-1){return -1;}return sockfd;}
2多进程并发客户端
#includestdio.h
#includestring.h
#includestdlib.h
#includeunistd.h
#includesys/socket.h
#includenetinet/in.h
#include arpa/inet.hint main()
{int sockfdsocket(AF_INET,SOCK_STREAM,0);if(sockfd-1){exit(1);}struct sockaddr_in saddr;memset(saddr,0,sizeof(saddr));saddr.sin_familyAF_INET;saddr.sin_porthtons(6000);saddr.sin_addr.s_addrinet_addr(127.0.0.1);int resconnect(sockfd,(struct sockaddr*)saddr,sizeof(saddr));if(res-1){printf(connect err\n);exit(1);}while(1){char buff[128]{0};printf(input\n);fgets(buff,128,stdin);if(strncmp(buff,end,3)0){break;}send(sockfd,buff,strlen(buff),0);memset(buff,0,sizeof(buff));recv(sockfd,buff,127,0);printf(recv%s\n,buff);}close(sockfd);}
父进程没有关闭链接子进程close不会完成四次挥手
3、tcp:
先建立连接TCP三次握手
最后断开TCP四次挥手
tcp的可靠性是以牺牲了开销为代价的
4、粘包
多次发送的数据被一次性收到了误以为是一次性收到的
解决办法让接收的时候能区分出来用不同的报文、在报文前面描述数据有多大、不连续send
5、UDP协议编程流程
(1)服务器端
1、创建套接字socket
2、指定IP和端口bind()
3、接受数据recvfrom()
4、发送数据sendto()
5、关闭close
#includestdio.h
#includestring.h
#includestdlib.h
#includeunistd.h
#includesys/socket.h
#includenetinet/in.h
#include arpa/inet.h
#includesignal.hint main()
{int sockfdsocket(AF_INET,SOCK_DGRAM,0);if(sockfd-1){return -1;}struct sockaddr_in saddr,caddr;memset(saddr,0,sizeof(saddr));saddr.sin_familyAF_INET;saddr.sin_porthtons(6000);saddr.sin_addr.s_addrinet_addr(127.0.0.1);int resbind(sockfd,(struct sockaddr*)saddr,sizeof(saddr));if(res-1){printf(bind err\n);exit(1);}int lensizeof(caddr);while(1){char buff[128]{0};recvfrom(sockfd,buff,127,0,(struct sockaddr*)caddr,len);printf(recv%s\n,buff);sendto(sockfd,ok,2,0,(struct sockaddr*)caddr,sizeof(caddr));}}
(2)客户端
1、创建套接字socket
2、发送sendto()//需要指定对方的IP和端口
3、接收recvfrom()//需要指定对方的IP和端口
4、关闭close()
#includestdio.h
#includestring.h
#includestdlib.h
#includeunistd.h
#includesys/socket.h
#includenetinet/in.h
#include arpa/inet.h
#includesignal.hint main()
{int sockfdsocket(AF_INET,SOCK_DGRAM,0);if(sockfd-1){exit(1);}struct sockaddr_in saddr;memset(saddr,0,sizeof(saddr));saddr.sin_familyAF_INET;saddr.sin_porthtons(6000);saddr.sin_addr.s_addrinet_addr(127.0.0.1);while(1){char buff[128]{0};printf(input\n);fgets(buff,128,stdin);if(strncmp(buff,end,3)0){break;}sendto(sockfd,buff,strlen(buff),0,(struct sockaddr*)saddr,sizeof(saddr));memset(buff,0,128);int lensizeof(saddr);recvfrom(sockfd,buff,127,0,(struct sockaddr*)saddr,len);printf(recv%s\n,buff);}close(sockfd);
}
对于udp编程因为是无连接的所以可以多个客户端发送客户端关闭服务器端不回收到任何数据服务器端关闭后对于客户端无影响。
协议不同可以使用同一个端口
6、tcp状态
只有在握手和挥手的时候回引起TCP协议的变化稳定收发连接的时候状态时不会发生改变的。
7、tcp状态转移图
三次握手完成有一个established状态四次挥手完成有一个time_wait()状态