网络编程 day3

TCP多进程并发服务器 

#include <stdio.h>
#include "/home/ubuntu/head.h"#define IP "192.168.124.85"
#define PORT 8888void handler(int sig)
{while(waitpid(-1,NULL,WNOHANG)>0);
}int main(int argc, const char *argv[])
{//回收僵尸进程if(signal(17,handler) == SIG_ERR){ERR_MSG("signal");return -1;}//创建流式套接字int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}printf("socket create success sfd=%d __%d__\n",sfd,__LINE__);//允许端口快速被复用---监测端口号是否真的有进程在占用,如果没有,则快速复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速复用成功\n");//定义并填充地址信息结构体,给服务绑定使用//真实的地址信息结构体根据地址族指定struct sockaddr_in sin;sin.sin_family   = AF_INET;sin.sin_port     = htons(PORT);sin.sin_addr.s_addr =inet_addr(IP);//绑定服务器自身的地址信息if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("binf");return -1;}printf("bind success __%d__\n",__LINE__);//讲套接字设置为被动接听状态if(listen(sfd,128)<0){ERR_MSG("listen");return -1;}printf("listen success __%d__\n",__LINE__);struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);while(1){//获取连接成功的客户端信息,生成一个新的套接字int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){ERR_MSG("accept");return -1;}printf("newfd=%d 客服端连接成功 __%d__\n",newfd,__LINE__);//创建父子进程pid_t cpid = fork();if(cpid<0){ERR_MSG("recv");return -1;}else if(0 == cpid){char buf[128]="";ssize_t res;while(1){//接受客服端数据res = recv(newfd,buf,sizeof(buf),0);if(res<0){ERR_MSG("recv");return -1;}else if(0 == res){printf("[%s : %d]newfd=%d 客服端下线 __%d__\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);break;}printf("[%s : %d]newfd=%d : %s __%d__\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf,__LINE__);//向客户端发送数据strcat(buf,"^_^");if(send(newfd,buf,sizeof(buf),0)<0){ERR_MSG("send");return -1;}printf("send success __%d__\n",__LINE__);}exit(0);}//父进程close(newfd);}return 0;
}

 TCP多线程并发服务器

#include <stdio.h>
#include "/home/ubuntu/head.h"#define IP "192.168.124.85"
#define PORT 8888struct climsg
{int newfd;struct sockaddr_in cin;
};void* deal_cli_msg(void* arg);int main(int argc, const char *argv[])
{//创建流式套接字int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}printf("socket create success sfd=%d __%d__\n",sfd,__LINE__);//允许端口快速被复用---监测端口号是否真的有进程在占用,如果没有,则快速复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速复用成功\n");//定义并填充地址信息结构体,给服务绑定使用//真实的地址信息结构体根据地址族指定struct sockaddr_in sin;sin.sin_family   = AF_INET;sin.sin_port     = htons(PORT);sin.sin_addr.s_addr =inet_addr(IP);//绑定服务器自身的地址信息if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("binf");return -1;}printf("bind success __%d__\n",__LINE__);//讲套接字设置为被动接听状态if(listen(sfd,128)<0){ERR_MSG("listen");return -1;}printf("listen success __%d__\n",__LINE__);struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);pthread_t tid;struct climsg info;while(1){info.newfd = accept(sfd, (struct sockaddr*)&info.cin, &addrlen);if(info.newfd < 0){ERR_MSG("accept");return -1;}if(pthread_create(&tid,NULL,deal_cli_msg,(void*)&info)!=0){fprintf(stderr,"pthread_create _%d_\n", __LINE__);return -1;}pthread_detach(tid);}//关闭if(close(sfd) < 0){ERR_MSG("close");return -1;}return 0;
}void* deal_cli_msg(void* arg)   //void* arg = &info
{int newfd = ((struct climsg*)arg)->newfd;struct sockaddr_in cin = ((struct climsg*)arg)->cin;char buf[128] = ""; ssize_t res = 0;while(1){   bzero(buf, sizeof(buf));//接收客户端数据res = recv(newfd, buf, sizeof(buf), 0); if(res < 0){ERR_MSG("recv");break;}else if(0 == res){printf("[%s : %d] newfd=%d 客户端下线 __%d__\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, __LINE__);break;}printf("[%s : %d] newfd=%d : %s __%d__\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, buf, __LINE__);//向客户端发送数据---->//从终端获取数据strcat(buf, "^_^");if(send(newfd, buf, sizeof(buf), 0) < 0){ERR_MSG("send");break;}printf("send success __%d__\n", __LINE__);}   close(newfd);printf("newfd = %d被关闭\n", newfd);pthread_exit(NULL);
}

        

 

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

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

相关文章

[kubernetes]Kube-APIServer

API Server API Server是什么 提供集群管理的REST API接口&#xff0c;包括认证授权、数据校验以及集群状态变更等提供其他模块之间的数据交互和通信的枢纽&#xff08;其他模块通过API Server查询或修改数据&#xff0c;只有API Server才直接操作etcd&#xff09; 访问控制…

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一…

Mongodb基础介绍与应用场景

NoSql 解决方案第二种 Mongodb MongoDB 是一款开源 高性能 无模式的文档型数据库 当然 它是NoSql数据库中的一种 是最像关系型数据库的 非关系型数据库 首先 最需要注意的是 无模式的文档型数据库 这个需要后面我们看到它的数据才能明白 其次是 最像关系型数据库的非关系型数据…

RK3588平台开发系列讲解(AI 篇)RKNN 数据结构详解

文章目录 一、rknn_sdk_version二、rknn_input_output_num三、rknn_tensor_attr四、rknn_perf_detail五、rknn_perf_run六、rknn_mem_size七、rknn_tensor_mem八、rknn_input九、rknn_output沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN 相关的数…

Autosar CAN开发02(入门Autosar)

Autosar架构 想起当时刚毕业进入公司之后&#xff0c;我的岗位是Autosar Bsw软件工程师。 看着这个什么“Autosar”&#xff0c;真的是一脸懵。 后来才知道&#xff0c;按照我的理解&#xff1a;Autosar就是一个软件架构。它分为ASW和BSW。ASW负责实现应用层功能&#xff08…

“React学习之旅:从入门到精通的点滴感悟“

在探索和学习React的过程中&#xff0c;我逐渐领悟到了前端开发的魅力与挑战。React&#xff0c;作为Facebook推出的开源JavaScript库&#xff0c;以其独特的思维方式和强大的功能&#xff0c;引领着前端开发的潮流。在这篇文章中&#xff0c;我将分享我的React学习心得&#x…

test assert-01-Google Truth 断言

Truth Truth 是用于Java测试的断言框架&#xff0c;灵感来自于FEST&#xff0c;并受到一些可扩展性需求的驱动&#xff0c;几乎完全由谷歌员工在业余时间编写&#xff0c;或者作为Java核心图书馆管理员的身份做出贡献。 作用 作为工程师&#xff0c;我们花费大部分的时间来阅…

《C++避坑神器·二十四》简单搞懂json文件的读写之根据键值对读写Json

c11 json解析库nlohmann/json.hpp文件整个代码由一个头文件组成 json.hpp&#xff0c;没有子项目&#xff0c;没有依赖关系&#xff0c;没有复杂的构建系统&#xff0c;使用起来非常方便。 json.hpp库在文章末尾下载 读写主要有两种方式&#xff0c;第一种根据键值对读写&…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Progress进度条组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Progress进度条组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Progress组件 进度条也是UI开发最常用的组件之一&#xff0c;进度条组件…

OpenAI换血大震动始末:“ChatGPT之父”奥特曼,缘何被“扫地出门”?

近期&#xff0c;AI业界发生了一场“大地震”。作为聊天机器人ChatGPT的开发者&#xff0c;OpenAI无疑是最受关注的人工智能公司之一。就是这家公司的联合创始人、CEO、有“ChatGPT之父”之称的阿尔特曼在“疯狂的5天”里&#xff0c;经历了被闪电免职、加入微软、最终又官复原…

影响嵌入式项目成功的一些要素

选择了嵌入式开发这个技术领域&#xff0c;就相当于选择了一条充满挑战的技术开发道路。 对于工程师而言&#xff0c;项目的成功和失败对他们十分重要。因为一行行代码他们不知道熬了多少个通宵&#xff0c;脑细胞死了多少而写出来的。 如果项目失败了&#xff0c;就意味着辛辛…

移动开发新的风口?Harmony4.0鸿蒙应用开发基础+实践案例

前段时间鸿蒙4.0引发了很多讨论&#xff0c;不少业内人士认为&#xff0c;鸿蒙将与iOS、安卓鼎足而三了。 事实上&#xff0c;从如今手机操作系统竞赛中不难看出&#xff0c;安卓与iOS的形态、功能逐渐趋同化&#xff0c;两大系统互相取长补短&#xff0c;综合性能等差距越来越…

【Element】el-select下拉框实现选中图标并回显图标

一、背景 需求&#xff1a;在下拉框中选择图标&#xff0c;并同时显示图标和文字&#xff0c;以便用户可以直观地选择所需的图标。 二、功能实现 <template><div><el-table ref"table" :data"featureCustom2List" height"200"…

分享71个Java源码总有一个是你想要的

分享71个Java源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1frK-W3GT8WrydSlQ-E3o6A?pwd6666 提取码&#xff1a;6666 UI代码 def __init__(self):import …

Text2SQL学习整理(五)将Text-to-SQL任务与基本语言模型结合

导语 上篇博客&#xff1a;Text2SQL学习整理&#xff08;四&#xff09;将预训练语言模型引入WikiSQL任务简要介绍了两个借助预训练语言模型BERT来解决WIkiSQL数据集挑战的方法&#xff1a;SQLOVA和X-SQL模型。其中&#xff0c;借助预训练语言模型的强大表示能力&#xff0c;S…

【Gitlab】CICD流水线自动化部署教程

第一步&#xff0c;准备 GitLab 仓库 这个不用多说&#xff0c;得先保证你的项目已经托管在一个 GitLab 仓库中。 第二步&#xff0c;定义 .gitlab-ci.yml 文件 在你的项目根目录中创建一个 .gitlab-ci.yml 文件。这个文件将定义所有 CI/CD 的工作流程&#xff0c;包括构建、测…

C++中的内存锁定

内存锁定(memory locking)是确保进程保留在主内存中并且免于分页的一种方法。在实时环境中&#xff0c;系统必须能够保证将进程锁定在内存中&#xff0c;以减少数据访问、指令获取、进程之间的缓冲区传递等的延迟。锁定内存中进程的地址空间有助于确保应用程序的响应时间满足实…

OCP NVME SSD规范解读-1

OCP&#xff08;Open Compute Project&#xff09;是一个由Facebook于2011年发起的开源项目。其目标是重新设计和优化数据中心的硬件&#xff0c;包括服务器、存储、网络设备等&#xff0c;以提高效率&#xff0c;降低运营成本&#xff0c;并推动技术的创新和标准化。 在OCP中&…

Leetcode的AC指南 —— 哈希法:1. 两数之和

摘要&#xff1a; Leetcode的AC指南 —— 哈希法&#xff1a;1. 两数之和。题目介绍&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 文章目录 一、题目二、解…

C语言:void*概述(垃圾桶)

void*类型时&#xff0c;我们通常是在处理一种特殊的指针类型&#xff0c;它可以存储任何数据类型的地址。在本文中&#xff0c;我们将深入探讨void*的特性以及在实际编程中如何使用它。 1. void*概述 void*是C语言中的一种特殊指针类型&#xff0c;它可以存储任何数据类型的…