TCP特点UDP编程

news/2024/5/18 13:38:44 标签: tcp/ip, udp, 网络

目录

udp%E5%8D%8F%E8%AE%AE-toc" style="margin-left:0px;">1、tcp协议和udp协议

2、多线程并发和多进程并发:

(1)多进程并发服务端

(2)多进程并发客户端:

3、tcp:

4、粘包

5、UDP协议编程流程

(1)服务器端:

(2)客户端:

6、tcp状态:

7、tcp状态转移图:


udp%E5%8D%8F%E8%AE%AE">1、tcp协议和udp协议

tcp协议:面向连接   可靠   流式服务

udp协议:无连接   不可靠   数据报

根据场景来决定使用什么协议

2、多线程并发和多进程并发:

多线程并发,如果线程出现失误可能导致整个进程失败,多进程互相不影响

(1)多进程并发服务端

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<signal.h>

int socket_init();
void do_run(int c)
{
    while(1)
    {
        char buff[128]={0};
        int num=recv(c,buff,127,0);
        if(num<=0)
        {
            break;
        }
        printf("child read:%s",buff);
        send(c,"ok",2,0);


    }
}
int main()
{
    signal(SIGCHLD,SIG_IGN);//处理僵死进程   一个是忽略信号,一个是wait();
    int sockfd=socket_init();
    if(sockfd==-1)
    {
        printf("socket err\n");
        exit(1);
    }

    while(1)
    {
        struct sockaddr_in caddr;
        int len=sizeof(caddr);
        int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)
        {
            continue;
        }
        printf("c=%d\n",c);


        pid_t pid=fork();
        if(pid==-1)
        {
            close(c);
            continue;
        }
        if(pid==0)
        {
            close(sockfd);
            do_run(c);
            close(c);
            printf("child exit  pid=%s\n",getpid());
            exit(0);
        }
        close(c);

    }


}
int socket_init()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        return -1;
    }
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");


    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(res==-1)
    {
        return -1;
    }

    res=listen(sockfd,5);
    if(res==-1)
    {
        return -1;
    }
    return sockfd;



}

(2)多进程并发客户端:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>


int main()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        exit(1);
    }

    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");


    int res=connect(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()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<signal.h>


int main()
{
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd==-1)
    {
        return -1;
    }

    struct sockaddr_in saddr,caddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");

    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(res==-1)
    {
        printf("bind err\n");
        exit(1);
    }

    int len=sizeof(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()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<signal.h>

int main()
{
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd==-1)
    {
        exit(1);
    }

    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_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 len=sizeof(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()状态

 

 


http://www.niftyadmin.cn/n/4957359.html

相关文章

Unity中实现获取InputField选中的文字

一&#xff1a;前言 获取到选中的文字&#xff1a;哈哈 二&#xff1a;实现 UGUI的InputField提供了selectionAnchorPosition和selectionFocusPosition&#xff0c;开始选择时的光标下标和当前光标下标 using UnityEngine; using UnityEngine.EventSystems; using UnityEngin…

go work 笔记 (多模块工作区)

目录 1. go work 笔记 (多模块工作区)1.1. 什么是 go work1.2. go work 支持命令1.3. go.work 文件结构1.4. use 指定使用的模块目录1.5. replaces 替换依赖仓库地址1.6. go.work 文件优先级高于 go.mod 中定义1.7. 如何使用1.8. 如何禁用工作区1.9. 开发流程演示1.10. 总结 1.…

集成放大器 电路 分析 设计过程中的概念和要点

集成运放的三大特性&#xff1a;虚短、虚断、 和 虚地把这几个特性理解明白了&#xff0c; 后面的电路分析就很容易上手。 虚短&#xff1a;UPUN&#xff0c;两输入端电压相等。虚断&#xff1a;IPIN0&#xff0c;两输入端的输入电流为0。虚地&#xff1a;UPUN0&#xff0c…

如何将PDF文件转换为PPT文件?

如何将pdf转换成ppt&#xff1f;PDF文件作为常用的文件格式&#xff0c;不仅可以在教学过程中使用&#xff0c;还可以在营销展会、培训讲座等过程中使用。欧迪芬文件的使用&#xff0c;能够在一定程度上提升我们的办公效率。对于PDF文件来说&#xff0c;其中包含的元素非常多&a…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 五)

管理应用拥有的状态概述 LocalStorage&#xff1a;页面级UI状态存储 LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility内&#xff0c;页面间共享状态。 本文仅介绍LocalStora…

基于Java SpringBoot+vue+html 的地方美食系统(2.0版本)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,csdn、博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统流程的分析3.1 用户管理的流程3.2个人中心管理流程3.3登录流程 4系统设计…

计算机竞赛 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

EFCore常见用法

1、跟踪查询。查询到的对象可以用来修改数据库中的值 var firstdb.list.First(); first.Name"已修改"; context.SaveChanges();2、非跟踪查询。查询到的对象无法修改数据库中的值 var firstdb.list.AsNoTracking().First(); first.Name"已修改"; db.Save…