Linux TCP 通信并发

多进程

客户端

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {//创建套接字int lfd = socket(AF_INET, SOCK_STREAM, 0);if(lfd == -1) {perror("socket");exit(-1);}//连接服务器struct sockaddr_in serveraddr;inet_pton(AF_INET, "192.168.245.129", &serveraddr.sin_addr.s_addr);serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9999);int ret = connect(lfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr));if(ret == -1) {perror("connect");_exit(-1);}//通信int i = 0;char receiveBuf[1024] = {0};while(1) {sprintf(receiveBuf, "data: %d\n", i++);write(lfd, receiveBuf, strlen(receiveBuf));sleep(1);int len = read(lfd, receiveBuf, sizeof(receiveBuf));if(len == -1) {perror("read");exit(0);} else if(len > 0) {printf("receive server data: %s\n", receiveBuf);} else if (len == 0) {printf("server closed...");}}close(lfd);
}

服务器端

#define _XOPEN_SOURCE
#include<stdio.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<wait.h>
#include<errno.h>void recyleChild(int arg) {while(1) {int ret = waitpid(-1, NULL, WNOHANG);if(ret == -1) {break;} else if (ret == 0) {break;} else if (ret > 0) {printf("pid %d is resaved\n", ret);}}
}int main() {//注册信号捕捉函数struct sigaction act;act.sa_flags = 0;sigemptyset(&act.sa_mask);act.sa_handler = recyleChild;sigaction(SIGCHLD, &act, NULL);//创建socketint lfd = socket(AF_INET, SOCK_STREAM, 0);if(lfd == -1) {perror("socket");exit(0);}struct sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(9999);saddr.sin_addr.s_addr = INADDR_ANY;//绑定int ret = bind(lfd, (struct sockaddr*)&saddr, sizeof(saddr));if(ret == -1) { perror("bind");exit(0);}//监听ret = listen(lfd, 128);if(ret == -1) { perror("listen");exit(0);}//接受链接while(1) {struct sockaddr_in cliaddr;int len = sizeof(cliaddr);int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len);   if(cfd == -1) {if(errno == EINTR) {continue;}perror("accept");exit(-1);}//每连接一个,创建一个子进程pid_t pid = fork();if(pid == 0) {char clientIP[16];inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, clientIP, 16);unsigned short cliPort = ntohs(cliaddr.sin_port);printf("Client Port is %d, client addr is %s\n", cliPort, clientIP);char recvBuf[1024] = {0};while(1) {int len = read(cfd, &recvBuf, sizeof(recvBuf));if(len == -1) {perror("read");return 0;} else if(len > 0) {printf("recv client data : %s \n", recvBuf);} else {printf("closed.....");}write(cfd, &recvBuf, sizeof(recvBuf));}close(cfd);exit(0);}}close(lfd);return 0;
}

多线程

服务器

#define _XOPEN_SOURCE
#include<stdio.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<pthread.h>struct sockinfo {int fd;struct sockaddr_in saddr;pthread_t tid;
};struct sockinfo sockinfos[128];void* working(void* arg) {struct sockinfo* pinfo = (struct sockinfo*) arg;char clientIP[16];inet_ntop(AF_INET, &pinfo->saddr.sin_addr.s_addr, clientIP, 16);unsigned short cliPort = ntohs(pinfo->saddr.sin_port);printf("Client Port is %d, client addr is %s\n", cliPort, clientIP);char recvBuf[1024] = {0};while(1) {int len = read(pinfo->fd, &recvBuf, sizeof(recvBuf));if(len == -1) {perror("read");return 0;} else if(len > 0) {printf("recv client data : %s \n", recvBuf);} else {printf("closed.....");}write(pinfo->fd, &recvBuf, sizeof(recvBuf));}close(pinfo->fd);exit(0);return NULL;
}int main() {//创建socketint lfd = socket(AF_INET, SOCK_STREAM, 0);if(lfd == -1) {perror("socket");exit(0);}struct sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(9999);saddr.sin_addr.s_addr = INADDR_ANY;//绑定int ret = bind(lfd, (struct sockaddr*)&saddr, sizeof(saddr));if(ret == -1) { perror("bind");exit(0);}//监听ret = listen(lfd, 128);if(ret == -1) { perror("listen");exit(0);}//初始化数据int max = sizeof(sockinfos) / sizeof(sockinfos[0]);for(int i = 0; i < max; i++) {memset(&sockinfos[i], 0, sizeof(sockinfos[i]));sockinfos[i].fd = -1;sockinfos[i].tid = -1;}//接受链接while(1) {struct sockaddr_in cliaddr;int len = sizeof(cliaddr);int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len);   if(cfd == -1) {perror("accept");exit(-1);}struct sockinfo * pinfo;for(int i = 0; i < max; i++) {if(sockinfos[i].fd == -1) {pinfo = &sockinfos[i];break;}if(i == max - 1) {sleep(1);i--;}}pinfo->fd = cfd;memcpy(&pinfo->saddr, &cliaddr, len);//每连接一个,创建一个子进程pthread_create(&pinfo->tid, NULL, working, pinfo);pthread_detach(pinfo->tid);}close(lfd);return 0;
}

客户端

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {//创建套接字int lfd = socket(AF_INET, SOCK_STREAM, 0);if(lfd == -1) {perror("socket");exit(-1);}//连接服务器struct sockaddr_in serveraddr;inet_pton(AF_INET, "192.168.245.129", &serveraddr.sin_addr.s_addr);serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9999);int ret = connect(lfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr));if(ret == -1) {perror("connect");_exit(-1);}//通信int i = 0;char receiveBuf[1024] = {0};while(1) {sprintf(receiveBuf, "data: %d\n", i++);write(lfd, receiveBuf, strlen(receiveBuf));sleep(1);int len = read(lfd, receiveBuf, sizeof(receiveBuf));if(len == -1) {perror("read");exit(0);} else if(len > 0) {printf("receive server data: %s\n", receiveBuf);} else if (len == 0) {printf("server closed...");}}close(lfd);
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于BES平台音乐信号处理之DRC算法实现

基于BES平台音乐信号处理之DRC算法实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;加我微信hezkz17, 本群提供音频技术答疑服务 1 DRC实现 drc.h 2 调用 audio_process.c 3 DRC动态范围控制算法在音乐信号处理中的位置 4 DRC具体细节源码 可参考…

【单片机】17-温度传感器DS18B20

1.DS18B20相关背景知识 1.温度传感器 &#xff08;1&#xff09;测温度的方式&#xff1a;物理&#xff08;汞柱&#xff0c;气压&#xff09;&#xff0c;电子&#xff08;金属电性能随温度变化&#xff09; &#xff08;2&#xff09;早期&#xff1a;热敏电阻&#xff08;模…

Docker 配置基础优化

Author&#xff1a;rab 为什么要优化&#xff1f; 你有没有发现&#xff0c;Docker 作为线上环境使用时&#xff0c;Docker 日志驱动程序的日志、存储驱动数据都比较大&#xff08;尤其是在你容器需要增删比较频繁的时候&#xff09;&#xff0c;动不动就好几百 G 的大小&…

【Mybatis源码】IDEA中Mybatis源码环境搭建

一、Mybatis源码源 在github中找到Mybatis源码地址&#xff1a;https://github.com/mybatis/mybatis-3 找到Mybatis git地址 二、IDEA导入Mybatis源码 点击Clone下载Mybatis源码 三、选择Mybatis分支 选择Mybatis分支&#xff0c;这里我选择的是3.4.x分支

C++-Mongoose(3)-http-server-https-restful

1.url 结构 2.http和 http-restful区别在于对于mg_tls_opts的赋值 2.1 http和https 区分 a) port地址 static const char *s_http_addr "http://0.0.0.0:8000"; // HTTP port static const char *s_https_addr "https://0.0.0.0:8443"; // HTTP…

嵌入式养成计划-33--数据库-sqlite3

七十一、 数据库 71.1 数据库基本概念 数据&#xff08;Data&#xff09; 能够输入计算机并能被计算机程序识别和处理的信息集合数据库 &#xff08;Database&#xff09;数据库是在数据库管理系统管理和控制之下&#xff0c;存放在存储介质上的数据集合 常用的数据库 大型数…

数据库sql查询成绩第二高

select * from propro; #查询成绩第二高 select max(id) from propro where id <(select max(id) from propro); #查询成绩第二高的第二种方式 select * from (select * from propro order by id desc limit 2) as b order by id asc limit 1;

蓝桥杯 使用sort排序(c++)

sort是一个C已经为我们实现好的工具&#xff0c;当我们要用它时&#xff0c;需要先引入一个算法的库—— < algorithm >。需要说明的是&#xff0c;sort可以排序任何类型的元素&#xff0c;包括我们自己定义的结构体。 我们将需要在C文件的开始位置加上&#xff1a; #in…

04训练——基于YOLO V8的自定义数据集训练——在windows环境下使用pycharm做训练-1总体步骤

在上文中,笔者介绍了使用google公司提供的免费GPU资源colab来对大量的自定义数据集进行模型训练。该方法虽然简单好用,但是存在以下几方面的短板问题: 一是需要通过虚拟服务器做为跳板机来访问,总体操作起来非常繁杂。 二是需要将大量的数据上传缓慢,管理和使用非常不友…

【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践应用

目录 第一章 理论基础 第二章 开发环境搭建 第三章 遥感大数据处理基础与ChatGPT等AI模型交互 第四章 典型案例操作实践 第五章 输入输出及数据资产高效管理 第六章 云端数据论文出版级可视化 更多应用 随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近…

STM32--人体红外感应开关

本文主要介绍基于STM32F103C8T6和人体红外感应开关实现的控制算法 简介 人体红外模块选用HC-SR501人体红外传感器&#xff0c;人体红外感应的主要器件为人体热释电红外传感器。人体都有恒定的体温&#xff0c;一般在36~37度&#xff0c;所以会发出特定波长的红外线&#xff0…

每日leetcode_193二叉搜索树的最近公共祖先

每日leetcode_193二叉搜索树的最近公共祖先 记录自己的成长&#xff0c;加油。 题目出处&#xff1a;LCR 193. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 题目 思路&#xff1a; 解题 class Solution {public TreeNode lowestCommonAncestor(TreeNod…