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

2024-06-21 21:20

本文主要是介绍用进程和线程完成TCP进行通信操作及广播和组播的通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进程

代码

 #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号信息SIGCHLDif(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 888814 #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 msg21 {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;
}

这篇关于用进程和线程完成TCP进行通信操作及广播和组播的通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082367

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优