2.11...

2024-02-18 01:12
文章标签 2.11

本文主要是介绍2.11...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 多进程

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <head.h>#define PORT 8888             //1024~49151
#define IP "192.168.122.120" //ifconfig查看本机IPint deal_cli_msg(int newfd, struct sockaddr_in cin);void handler(int sig)
{while(waitpid(-1, NULL, WNOHANG) > 0);
}int main(int argc, const char *argv[])
{//捕获17) SIGCHLD信号if(signal(17, handler) == SIG_ERR){ERR_MSG("signal");return -1;}printf("捕获成功\n");//创建流式套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd < 0){ERR_MSG("socket");return -1;}printf("sfd = %d\n", sfd);//设置允许端口被快速复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用成功\n");//填充地址信息结构体,真实的地址信息结构体根据地址族指定//AF_INET: man 7 ipstruct sockaddr_in sin;sin.sin_family      = AF_INET;      //必须填AF_INETsin.sin_port        = htons(PORT);  //端口号:1024~49151sin.sin_addr.s_addr = inet_addr(IP); //本机IP ifconfig查看//绑定服务器的IP和端口--->必须绑定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("bind");return -1;}printf("bind success \n");//将套接字设置为被动监听状态if(listen(sfd, 128) < 0){ERR_MSG("listen");return -1;}printf("listen success\n");struct sockaddr_in cin;     //存储客户端的地址信息socklen_t addrlen = sizeof(cin);int newfd = -1;pid_t cpid = 0;while(1){//父进程只负责连接//从已完成连接的队列中获取一个客户端信息,生成一个新的文件描述符//该文件描述符才是与客户端通信的文件描述符newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(newfd < 0){ERR_MSG("accept");return -1;}printf("[%s : %d] newfd=%d 客户端连接成功\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);//能运行到当前位置,则代表有客户端连接成功,此时需要创建一个子进程,专门用于交互cpid = fork();if(0 == cpid)       //子进程中为真{close(sfd);         //子进程只负责交互,所以sfd对于子进程而言没有用deal_cli_msg(newfd, cin);exit(0);            //交互结束后,必须要退出子进程}close(newfd);       //父进程只负责连接,所以newfd对于父进程而言没有用}//关闭所有文件描述符close(sfd);return 0;
}int deal_cli_msg(int newfd, struct sockaddr_in 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");return -1;}else if(0 == res){printf("[%s : %d] newfd=%d 客户端下线\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);                                  break;}printf("[%s : %d] newfd=%d : %s\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, buf);//发送数据strcat(buf, "*_*");if(send(newfd, buf, sizeof(buf), 0) < 0){ERR_MSG("send");return -1;}printf("send success\n");}close(newfd);return 0;
}

多线程

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>
#include <head.h>#define PORT 8888             //1024~49151
#define IP "192.168.122.120" //ifconfig查看本机IP//需要传入到分支线程的数据类型
struct Climsg
{int newfd;struct sockaddr_in cin;
};void* deal_cli_msg(void* arg);  //void* arg = (void*)&infoint main(int argc, const char *argv[])
{//创建流式套接字int sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd < 0){   ERR_MSG("socket");return -1; }   printf("sfd = %d\n", sfd);//设置允许端口被快速复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){   ERR_MSG("setsockopt");return -1; }   printf("允许端口快速重用成功\n");//填充地址信息结构体,真实的地址信息结构体根据地址族指定//AF_INET: man 7 ipstruct sockaddr_in sin;sin.sin_family      = AF_INET;      //必须填AF_INETsin.sin_port        = htons(PORT);  //端口号:1024~49151sin.sin_addr.s_addr = inet_addr(IP); //本机IP ifconfig查看//绑定服务器的IP和端口--->必须绑定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0){   ERR_MSG("bind");return -1; }   printf("bind success \n");//将套接字设置为被动监听状态if(listen(sfd, 128) < 0){   ERR_MSG("listen");return -1; }   printf("listen success\n");struct sockaddr_in cin;     //存储客户端的地址信息socklen_t addrlen = sizeof(cin);int newfd = -1; pthread_t tid;struct Climsg info;while(1){   newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(newfd < 0){ERR_MSG("accept");return -1;}printf("[%s : %d] newfd=%d 客户端连接成功\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);info.newfd = newfd;info.cin = cin;//能运行到当前位置,则代表有客户端连接成功,需要创建一个分支线程只负责交互if(pthread_create(&tid, NULL, deal_cli_msg, (void*)&info) != 0){fprintf(stderr, "pthread_create failed __%d__\n", __LINE__);return -1; }pthread_detach(tid);        //分离线程}   //关闭所有文件描述符close(sfd);return 0;
}//线程执行体
void* deal_cli_msg(void* arg)   //void* arg = (void*)&info
{//newfd必须另存。不允许使用全局变量,或者所有线程通过指针的方式一直访问同一块空间//因为一旦有多个客户端连接到服务器,会导致全局变量的newfd被覆盖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 客户端下线\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);break;}printf("[%s : %d] newfd=%d : %s\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, buf);//发送数据strcat(buf, "*_*");if(send(newfd, buf, sizeof(buf), 0) < 0){ERR_MSG("send");break;}printf("send success\n");}   close(newfd);pthread_exit(NULL);
}

这篇关于2.11...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

2.11键盘事件

目录 实验原理 实验代码 实验结果 实验原理        简单、常用的键盘事件是等待按键事件,它由 waitKey 函数来实现。无论是刚开始学习 OpenCV,还是使用 OpenCV 进行开发调试,都可以看到waitKey 函数的身影,然而基础的东西往往容易忽略掉,在此可以好好了解一下这个基础又常用的waitKey 函数。该函数延时一个时间,返回按键的值,当参数为 0 时就永久等待

[C++] 小游戏 斗破苍穹 2.11.6 版本 zty出品

大家好,今天zty带来的是斗破苍穹的 2.11.6 版本,这个版本主要更新了:1、背包   2、将退出游戏改到了设置里面  3、如果不逃跑不会停止战斗。废话不多说,  先赞后看  养成习惯 code #include<stdio.h>#include<iostream>#include<ctime>#include<bits/stdc++.h>#include<conio.h>

docker-compose harbor 2.11

harbor 前言 “Harbor” 是一个用于管理容器镜像的开源仓库项目。由 VMware 开发和维护,Harbor 提供一个企业级的 Docker 镜像仓库,具有丰富的功能,包括: 镜像管理:提供存储和分发 Docker 镜像的能力。安全性:支持镜像签名和漏洞扫描,确保镜像的安全性。身份认证:集成了多种身份认证方式,如 LDAP 和 OAuth。访问控制:基于角色的访问控制(RBA

2.11 JSON读写3:读写JSON文件

概述 本地文件是存储JSOP数据的一个重要方案将Go数据以JSON字符串的形式写出到文件中的过程称之为编码从文件中读取JSON字符串为Go数据的过程称之为解码 导入依赖 import ("encoding/json""os""fmt") 定义结构体 type PersonII struct {Name stringAge intSex bool

2.11 ViewFlipper(翻转视图)的使用

一、ViewFlipper 静态导入 1、布局文件 首先,创建4个图片布局文件: page_1.xml : <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_par

2.11学习内容,设计模式:(门面模式)外观模式

原文:http://blog.csdn.net/evankaka/article/details/43686613 GOF《设计模式》一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。 本人android开速开发框架mquery也使用了这个模式,地址 https://gith

安装mantis 2.11.1

1、下载 下载地址: https://www.mantisbt.org/download.php 2、解压缩后上传 个人比较喜欢FileZilla(看过他家的bug工具BugZilla的安装,知难而退了)。服务器我用的万网虚拟主机和阿里云RDS数据库,所以文件上传到htdocs目录下。这个看个人喜好和各自的情况,只要能有PHP和MySql环境即可。 3、安装配置 打开mantis访问路径

spark运行报: Scala module 2.10.0 requires Jackson Databind version >= 2.10.0 and < 2.11.0

这是jackson多版本问题 , 我们需要屏蔽所有hadoop 组件中的Jackson ,修改pom文件,之后就不报异常了 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>${hadoop.version}</version><exclusion

2.11题目

#include <stdio.h> int main() {     char a;     while((a = getchar()) != -1)     {         if(a >= 'A' && a <= 'Z')         a+=32;         putchar(ch);      }     return 0;} ————————————————

2.11:递归操作

1.递归实现n! 程序代码: 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 int fun(int n);5 int main(int argc, const char *argv[])6 {7 int n;8 printf("please enter n:");9 scanf("%d",&