用进程和线程完成TCP进行通信操作及广播和组播的通信

news2024/11/24 19:36:53

进程

代码

 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <signal.h>
 #include <sys/wait.h>
 
 #define PORT 8888
 #define IP "192.168.124.62"                                                                                                           
 #define ERR_MSG(msg) do{\
     fprintf(stderr,"line=%d",__LINE__);\
     perror(msg);\
 }while(0)
 void handler(int sig)
 {
     while(waitpid(-1,NULL,WNOHANG)>0);
 }
 int main(int argc, const char *argv[])
 {
     //创建套接字
     int fd = socket(AF_INET,SOCK_STREAM,0);
     if(fd<0)
     {
         ERR_MSG("socket");
         return -1;
     }
     printf("-流式套接字\n");
     //捕获17号信息SIGCHLD
     if(signal(17,handler) == SIG_ERR)
     {
         ERR_MSG("signal");
         return -1;
     }
 
     //允许端口号重复使用
     int reuse = 1;
     if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
     {
         ERR_MSG("setsockopt");
         return -1;
     }
     printf("端口允许快速重用\n");
     //创建一个地址信息结构体,bind绑定需要用到
     struct sockaddr_in sin;
     sin.sin_family = AF_INET;
     sin.sin_port   = htons(PORT);
     sin.sin_addr.s_addr = inet_addr(IP);
     //绑定ip和端口
     if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0)
     {
         ERR_MSG("bind");
         return -1;
     }
     printf("绑定成功\n");
 
     //将套接字设置为监听状态
     if(listen(fd,128)<0)
     {
         ERR_MSG("listen");
         return -1;
     }
     printf("监听成功\n");
 
     int newfd;
     pid_t pid;
     struct sockaddr_in cin;
     socklen_t socklen = sizeof(cin);
 
 while(1)
 {
     //获取连接成功的套接字,用于阻塞等待连接
     newfd = accept(fd,(struct sockaddr*)&cin,&socklen);
     if(newfd <0)
     {
         ERR_MSG("accept");
         return -1;
     }
     printf("[%s:%d]客户端连接成功%d\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd);
 
     pid = fork();
     if(pid == 0)
     {
         close(fd);
         //接收与发送
         char buf[128];
         ssize_t size;
         while(1)
         {
             //接收
             //
             bzero(buf,sizeof(buf));//清空数组内容
     //      size = read(newfd,buf,sizeof(buf));
             size = recv(newfd,buf,sizeof(buf),0);
     //      size = recvfrom(newfd,buf,sizeof(buf),0,NULL,NULL);
             if(size<0)
             {
                 ERR_MSG("recv");
                 return -1;
             }else if(size==0)
             {
                 printf("[%s:%d]客户端下线\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));
                 break;
             }
             printf("[%s:%d]接收成功newfd=%d:%s\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd,buf);
 
 
             //发送
             printf("服务器回复>>>>");
             fgets(buf,sizeof(buf),stdin);
             buf[strlen(buf)-1] = '\0';
 
             if(send(newfd,buf,sizeof(buf),0)<0)
             {
                 ERR_MSG("send");
                 break;
             }
             printf("发送成功\n");
         }
         close(newfd);
         exit(0);
     }
     close(newfd);
 }
     close(fd);
 
     return 0;
 }

运行结果图:

线程

代码:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/socket.h>
  4 #include <netinet/in.h>
  5 #include <arpa/inet.h>
  6 #include <string.h>
  7 #include <unistd.h>
  8 #include <stdlib.h>
  9 #include <signal.h>
 10 #include <sys/wait.h>
 11 #include <pthread.h>
 12 
 13 #define PORT 8888
 14 #define IP "192.168.124.62"
 15 #define ERR_MSG(msg) do{\
 16     fprintf(stderr,"line=%d",__LINE__);\
 17     perror(msg);\
 18 }while(0)
 19 
 20 struct msg
 21 {
 22     int newfd;
 23     struct sockaddr_in cin;
 24 };
 25 void* huidiaolist(void* arg);
 26 int main(int argc, const char *argv[])
 27 {
 28     //创建套接字
 29     int fd = socket(AF_INET,SOCK_STREAM,0);
 30     if(fd<0)
 31     {
 32         ERR_MSG("socket");
 33         return -1;
 34     }
 35     printf("-流式套接字\n");
 36     //允许端口号重复使用
 37     int reuse = 1;
 38     if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
 39     {
 40         ERR_MSG("setsockopt");
 41         return -1;
 42     }
 43     printf("端口允许快速重用\n");
 44     //创建一个地址信息结构体,bind绑定需要用到
 45     struct sockaddr_in sin;
 46     sin.sin_family = AF_INET;
 47     sin.sin_port   = htons(PORT);
 48     sin.sin_addr.s_addr = inet_addr(IP);
 49     //绑定ip和端口
 50     if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0)
 51     {
 52         ERR_MSG("bind");
 53         return -1;
 54     }
 55     printf("绑定成功\n");
 56 
 57     //将套接字设置为监听状态
 58     if(listen(fd,128)<0)
 59     {
 60         ERR_MSG("listen");
 61         return -1;
 62     }
 63     printf("监听成功\n");
 64 
 65     int newfd;
 66     pid_t pid;
 67     struct sockaddr_in cin;
 68     socklen_t socklen = sizeof(cin);
 69 
 70     pthread_t tid;
 71     struct msg  clinfo;
 72     while(1)
 73     {
 74         //获取连接成功的套接字,用于阻塞等待连接
 75         newfd = accept(fd,(struct sockaddr*)&cin,&socklen);
 76         if(newfd <0)
 77         {
 78             ERR_MSG("accept");
 79             return -1;
 80         }
 81         printf("[%s:%d]客户端连接成功%d\n",\
 82                 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),newfd);
 83 
 84         clinfo.newfd = newfd;
 85         clinfo.cin = cin;
 86         if(pthread_create(&tid,NULL,huidiaolist,(void*)&clinfo)!=0)
 87         {
 88             fprintf(stderr,"line=%d",__LINE__);
 89             break;
 90         }
 91         pthread_detach(tid);
 92     }
 93     close(fd);
 94 
 95 return 0;
 96 }
 97 
 98 void* huidiaolist(void* arg)
 99 {
100          //接收与发送
101          int newfd = ((struct msg*)arg)->newfd;
102          struct sockaddr_in cin = ((struct msg*)arg)->cin;
103 
104          char buf[128];
105          ssize_t size;
106          while(1)
107          {
108              //接收
109              //
110              bzero(buf,sizeof(buf));//清空数组内容
111      //      size = read(newfd,buf,sizeof(buf));
112              size = recv(newfd,buf,sizeof(buf),0);
113      //      size = recvfrom(newfd,buf,sizeof(buf),0,NULL,NULL);
114              if(size<0)
115              {
116                  ERR_MSG("recv");
117                  break;
118              }else if(size==0)
119              {
120                  printf("[%s:%d]客户端下线\n",\
121                          inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
122                  break;
123              }
124              printf("[%s:%d]接收成功newfd=%d:%s\n",\
125                      inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);
126 
127 
128              //发送
129              strcpy(buf,"回复");
130              if(send(newfd,buf,sizeof(buf),0)<0)
131              {
132                  ERR_MSG("send");
133                  break;
134              }
135              printf("发送成功\n");
136          }
137     close(newfd);
138     pthread_exit(NULL);

结果图:

广播

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

#define PORT 6667
#define IP "192.168.124.255"
#define ERR_MSG(msg) do{\
    fprintf(stderr,"line:%d\n",__LINE__);\
    perror(msg);\
}while(0)


int main(int argc, const char *argv[])
{
    int fd = socket(AF_INET,SOCK_DGRAM,0);
    if(fd<0)
    {
        ERR_MSG("scoket");
        return -1;
    }
    printf("创建流式套接字成功cd=%d\n",fd);


    //允许端口被重
    int reuse = 1;
    if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口被重复使用\n");
    //允许广播
    if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&reuse,sizeof(reuse))<0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    //绑定服务器地址信息,必须绑定
    struct sockaddr_in sin;
    sin.sin_family     = AF_INET;
    sin.sin_port       = htons(PORT);
    sin.sin_addr.s_addr= inet_addr(IP);
    //绑定IP及端口号
    if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("绑定成功\n");

    char arr[128];
    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(arr);
    while(1)
    {
        //发送数据
        printf("请输入数据>>>>>");
        fgets(arr,sizeof(arr),stdin);
        arr[strlen(arr)-1] = '\0';
        if(sendto(fd,arr,sizeof(arr),0,\
                    (struct sockaddr*)&sin,sizeof(sin))<0)                  
        {
            ERR_MSG("sendto");
            return -1;
        }
        printf("发送成功\n");
        bzero(arr,sizeof(arr));
    }
    close(fd);
    return 0;
}

组播

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

#define PORT 6667
#define IP "224.1.2.3"
#define ERR_MSG(msg) do{\
    fprintf(stderr,"line:%d\n",__LINE__);\
    perror(msg);\
}while(0)


int main(int argc, const char *argv[])
{
    int fd = socket(AF_INET,SOCK_DGRAM,0);
    if(fd<0)
    {
        ERR_MSG("scoket");
        return -1;                                                    
    }
    printf("创建流式套接字成功cd=%d\n",fd);


    //允许端口被重
    int reuse = 1;
    if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口被重复使用\n");
    //允许广播
    if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&reuse,sizeof(reuse))<0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    //绑定服务器地址信息,必须绑定
    struct sockaddr_in sin;
    sin.sin_family     = AF_INET;
    sin.sin_port       = htons(PORT);
    sin.sin_addr.s_addr= inet_addr(IP);
    //绑定IP及端口号
    if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("绑定成功\n");

    char arr[128];
    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(arr);
    while(1)
    {

        //发送数据 
        printf("请输入数据>>>>>");
        fgets(arr,sizeof(arr),stdin);
        arr[strlen(arr)-1] = '\0';
        if(sendto(fd,arr,sizeof(arr),0,\
                    (struct sockaddr*)&sin,sizeof(sin))<0)
        {
            ERR_MSG("sendto");
            return -1;
        }
        printf("发送成功\n");
        bzero(arr,sizeof(arr));
    }
    close(fd);
    return 0;
}
                                                                      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1847095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用idea连接Oracle数据库?

idea版本&#xff1a;2021.3.3 Oracle版本&#xff1a;10.2.0.1.0&#xff08;在虚拟机Windows sever 2003 远程连接数据库&#xff09; 数据库管理系统&#xff1a;PLSQL Developer 在idea里面找到database&#xff0c;在idea侧面 选择左上角加号&#xff0c;新建&#xff…

消息队列kafka中间件详解:案例解析(第10天)

系列文章目录 1- 消息队列&#xff08;熟悉&#xff09;2- Kafka的基本介绍&#xff08;掌握架构&#xff0c;其他了解&#xff09;3- Kafka的相关使用&#xff08;掌握kafka常用shell命令&#xff09;4- Kafka的Python API的操作&#xff08;熟悉&#xff09; 文章目录 系列文…

0.15元1.5Mhz-1.3A同步整流BUCK降压DCDC芯片MT3410(MT3410LB)

前言 国产同步整流DCDC&#xff0c;参考价格约0.15元。 特征 高效率&#xff1a;高达 96% 1.5MHz恒定频率操作 1.3A 输出电流 无需肖特基二极管 2.3V至7V输入电压范围 输出电压低至 0.6V PFM 模式可在轻负载下实现高效率 压差操作中的100%占空比 低静态电流&#xff1a;35μ…

开放式耳机哪个品牌质量比较好?五大公认性能之王推荐!

作为一名热爱音乐的DJ爱好者&#xff0c;我当然知道一款适合DJ使用的开放式耳机应该具备哪些特点。最近&#xff0c;我深入评测了几款热门开放式耳机&#xff0c;从音质、舒适度、耐用性到混音功能等方面进行了全面评估。今天&#xff0c;我想为大家分享我的评测结果&#xff0…

可视化数据科学平台在信贷领域应用系列六:自动机器学习(上篇)

在现代数据驱动的世界中&#xff0c;机器学习已经成为解决复杂问题和推动创新的重要手段。然而&#xff0c;传统的机器学习模型开发过程复杂且耗时&#xff0c;包括数据预处理、特征工程、模型选择、参数调优和模型评估等多个步骤环节&#xff0c;需要模型开发人员具备丰富的专…

深圳比创达电子|EMC与EMI一站式解决方案:源头到终端的全面防护

随着电子技术的飞速发展&#xff0c;电磁兼容性&#xff08;EMC&#xff09;和电磁干扰&#xff08;EMI&#xff09;问题日益成为产品研发和生产的关键因素。为了帮助企业更好地应对这些挑战。 一、EMC与EMI的基本概述 电磁兼容性&#xff08;EMC&#xff09;是指设备或系统在…

众爱宠物开源项目介绍

众爱宠物管理系统是一个集会员管理、宠物管理、商品管理、库存管理、数据管理、收银管理、多门店管理等功能于一体的综合管理系统&#xff0c;具有操作方便、简单、安全等优点。 开源项目地址

STM32---SPI通信协议(小白入、含源码)

写在前面&#xff1a;在单片机的学习过程中&#xff0c;各种通信协议的学习是必不可少的&#xff0c;在前面我们学习了串口通信、IIC通信&#xff0c;本节我们来认识一下SPI通信协议。包括其SPI基本概念、NORFLASH芯片的介绍以及相关的例程实验。 目录 一、SPI介绍 1.1什么是…

“一站式企业服务平台”的功能架构

为提升区域营商环境&#xff0c;为促进区域经济发展&#xff0c;实现资源高效配置&#xff0c;全国各区域政府及产业园区都越来越重视如何创新企业服务机制、提升企业服务水平&#xff0c;来保障区域内的企业稳定及帮扶企业高质量的发展。随着近年来大数据、人工智能等新一代信…

V4和V6双栈处理

现进行双栈 对R1 对R2 对R3 对R4 路由地址配完&#xff0c;起协议 然后起ripng&#xff0c;在R2&#xff0c;R3&#xff0c;R4上都宣告一下 然后在PC1和PC2上都手动配置一下就可以了

对比 Axios 和 Fetch:选择最适合的 HTTP 请求方法

在前端开发中&#xff0c;处理 HTTP 请求是一个常见且重要的任务。JavaScript 提供了多种方式来发送网络请求&#xff0c;其中最受欢迎的两种方式分别就是 Fetch API 和 Axios。尽管两者都能完成同样的任务&#xff0c;即从客户端向服务器发送请求并接收响应&#xff0c;但它们…

项目经验——交通行业数据可视化大屏、HMI设计

交通行业数据大屏、HMI设计时要的注意点&#xff1a;清晰可读、简洁直观、适配性强。颜色对比度满足WCAG标准&#xff0c;深色背景减少干扰&#xff0c;实时展示交通数据&#xff0c;支持有线网络控制内容更新&#xff0c;保障驾驶安全与决策效率。

V4L2读取摄像头资源

1.V4L2 它是Linux内核中标准的关于视频驱动程序&#xff0c;Video for Linux 2&#xff0c;简称V4L2。 它为Linux下的视频驱动提供了统一的接口&#xff0c;使得应用程序可以使用统一的API操作不同的视频设备。 V4L2支持三类设备&#xff1a;视频输入输出设备、VBI设备和rad…

飞速(FS)S5850-24XMG多速率交换机如何实现降本增速

在当今网络环境快速发展的背景下&#xff0c;以太网带宽呈现出快速增长的趋势&#xff0c;降低网络迭代成本成为影响企业决策的关键因素。飞速&#xff08;FS&#xff09;S5850-24XMG多速率交换机可提供无缝连接不同数据速率设备的解决方案&#xff0c;本文将探讨飞速&#xff…

day01-Numpy的安装

numpy的安装 同样&#xff0c;anaconda内置有Numpy包 Numpy是用c语言实现的&#xff0c;运算速度比python快得多 import numpy as np np.__version__out: 1.18.5使用Jupyter编辑器打印numpy包的版本 NumPy ndarray对象 NumPy定义了一个n维数组对象&#xff0c;简称ndarra…

vue 登录

1.创建项目 Set-ExecutionPolicy RemoteSigned npm install -g yarn yarn add axios yarn add element-pluspackage.json {"name": "tom6","version": "0.1.0","private": true,"scripts": {"serve": &…

乾元通渠道商中标金昌市自然灾害应急能力提升项目

近日&#xff0c;乾元通渠道商中标甘肃省金昌市自然灾害应急能力提升项目&#xff0c;乾元通作为设备厂家&#xff0c;为项目提供通信指挥类装备&#xff08;多链路聚合设备&#xff09; QYT-X1 。 随着万亿国债项目的全面铺开&#xff0c; 青岛乾元通数码科技有限公司 作为国家…

Databend 开源周报第 149 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持递归公共表…

2024 Testing Expo China – Automotive I 风丘与您相约上海世博馆

2024汽车测试及质量监控博览会&#xff08;中国&#xff09;——&#xff08;Testing Expo China – Automotive&#xff09;是面向整车、零部件和系统开发的各种技术和服务的盛会&#xff0c;展示了汽车测试、开发和验证技术的各个方面&#xff0c;每年在上海举行&#xff0c;…

使用Scala爬取安居客房产信息并存入CSV文件

使用Scala爬取安居客房产信息并存入CSV文件 本篇博客中&#xff0c;我们将介绍如何使用Scala语言编写一个简单的程序&#xff0c;来爬取安居客&#xff08;Anjuke&#xff09;网站上的房产信息&#xff0c;并将这些信息存储到CSV文件中。这个示例将涵盖HTTP请求、HTML解析、数…