02.11

1.多进程(信号)

#include "myhead.h"
#define PORT 2437
#define IP "192.168.125.115"
void handler(int signo){
	if(signo==SIGCHLD){
		while(waitpid(-1,NULL,WNOHANG)>0);

	}
}
//自定义处理客户端函数
int MY_sev(int newfd,struct sockaddr_in cin){ 
	char rbuf[128]="";
	while(1){
		bzero(rbuf,sizeof(rbuf));
		int res=recv(newfd,rbuf,sizeof(rbuf),0);
		if(res==0){
			printf("客户端下线\n");
			break;
		}
		printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);
		strcat(rbuf,":)");
		send(newfd,rbuf,sizeof(rbuf),0);
	}
	close(newfd);
	return 0;
	}

int main(int argc, const char *argv[])
{
	if(signal(SIGCHLD,handler)==SIG_ERR){
		perror("signal error");
		return -1;
	}
	
	int sfd=-1;
	if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1){
		perror("socket error");
		return -1;
	}
	printf("sfd=%d\n",sfd);
	//端口快速重用
	int reuse=1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){
		perror("setsockopt error");
		return -1;
	}
	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))==-1){
		perror("bind error");
		return -1;
	}
	printf("bind success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
	//3.将套接字设置成被动监听状态
	if(listen(sfd,128)==-1){
		perror("listen error");
		return -1;
	}
	printf("listen success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
	//4.1定义用于接收客户端地址信息的结构体变量
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
	//4.2接收客户端链接请求
	int newfd=-1;
	pid_t pid=-1;
	while(1){
	if((newfd=accept(sfd,(struct sockaddr*)&cin,&socklen))==-1){
		perror("accept error");
		return -1;
	}
		printf("[%s:%d]链接成功,newfd=%d\n",inet_ntoa(cin.sin_addr),\
				ntohs(cin.sin_port),newfd);
	pid=fork();
	if(pid>0){
		close(newfd);
	}else if(pid==0){
		close(sfd);
		MY_sev(newfd,cin);
		exit(EXIT_SUCCESS);

		
	}else{
		perror("fock error");
		return -1;
	}
	
	}
	close(sfd);
	
	return 0;
}

2.多线程

#include "myhead.h"
#define PORT 2437
#define IP "192.168.125.115"
struct pthread_node{
	int newfd;
	struct sockaddr_in cin;
};
void *task(void *arg){
	//5.收发数据
	int newfd=((struct pthread_node*)arg)->newfd;
	struct sockaddr_in cin=((struct pthread_node*)arg)->cin;

	char rbuf[128]="";
	while(1){
		bzero(rbuf,sizeof(rbuf));
		int res=recv(newfd,rbuf,sizeof(rbuf),0);
		if(res==0){
			printf("客户端下线\n");
			break;
		}
		printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);
		strcat(rbuf,":)");
		send(newfd,rbuf,sizeof(rbuf),0);
	}
	close(newfd);
	pthread_exit(NULL);

}
int main(int argc, const char *argv[])
{
	//1.创建套接字
	int sfd=-1;
	if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1){
		perror("socket error");
		return -1;
	}
	printf("sfd=%d\n",sfd);
	int reuse=1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){
		perror("setsockopt error");
		return -1;
	}
	//2.绑定地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(PORT);
	sin.sin_addr.s_addr=inet_addr(IP);
	//2.1填充地址信息结构体
	//2.2绑定工作
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
		perror("bind error");
		return -1;
	}
	printf("bind success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
	//3.将套接字设置成被动监听状态
	if(listen(sfd,128)==-1){
		perror("listen error");
		return -1;
	}
	printf("listen success_%d_%s_%s\n",__LINE__,__FILE__,__func__);
	//4.1定义用于接收客户端地址信息的结构体变量
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
	//4.2接收客户端链接请求
	int newfd=-1;
	pthread_t tid=-1;
	while(1){
	if((newfd=accept(sfd,(struct sockaddr*)&cin,&socklen))==-1){
		perror("accept error");
		return -1;
	}
		printf("[%s:%d]链接成功,newfd=%d\n",inet_ntoa(cin.sin_addr),\
				ntohs(cin.sin_port),newfd);
	struct pthread_node info={newfd,cin};
	if((tid=pthread_create(&tid,NULL,task,&info))!=0){
		perror("tid create error");
		return -1;
	}
	pthread_detach(tid);
	}
	close(sfd);
	
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要从给定的数据中删除特定的属性,您可以使用 Vue.js 中的 `v-for` 循环来遍历数据,并使用 `v-bind` 指令动态绑定属性。以下是一个示例代码,展示了如何在 Vue.js 中实现您的需求: ```html <template> <div> <div v-for="item in filteredData" :key="item.basicsMaterialNo"> <div v-if="item.inOutboundList"> <div v-bind="item.inOutboundList"></div> </div> <div v-else> <div v-bind="item"></div> </div> </div> </div> </template> <script> export default { data() { return { data: [ { adjustDesc: null, adjustStatus: 0, adjustWorkerPrices: null, backrestMaterialName: "HK001-44", backrestMaterialNo: "02.YCL.BL.SD.HK001-44", basicsMaterialName: "HK001-44", basicsMaterialNo: "02.YCL.BL.SD.HK001-44", createTime: 1, updateTime: 2 }, { adjustDesc: null, adjustStatus: 0, adjustWorkerPrices: null, backrestMaterialName: "HK001-44", backrestMaterialNo: "02.YCL.BL.SD.HK001-44", basicsMaterialName: "HK001-44", basicsMaterialNo: "02.YCL.BL.SD.HK001-44", createTime: 1, updateTime: 2 }, { adjustDesc: null, adjustStatus: 0, adjustWorkerPrices: null, backrestMaterialName: "HK001-44", backrestMaterialNo: "02.YCL.BL.SD.HK001-44", basicsMaterialName: "HK001-44", basicsMaterialNo: "02.YCL.BL.SD.HK001-44", inOutboundList: { afda:11, createTime: 1, updateTime: 2 }, createTime: 1, updateTime: 2 } ] } }, computed: { filteredData() { return this.data.map(item => { const updatedItem = { ...item }; // Create a shallow copy of the item // Remove createTime and updateTime properties delete updatedItem.createTime; delete updatedItem.updateTime; // If inOutboundList exists, remove its createTime and updateTime properties if (updatedItem.inOutboundList) { delete updatedItem.inOutboundList.createTime; delete updatedItem.inOutboundList.updateTime; } return updatedItem; }); } } } </script> ``` 在上面的代码中,我们使用 `v-for` 循环遍历数据数组,并使用 `v-bind` 指令动态绑定属性。在 `filteredData` 计算属性中,我们创建了每个项的浅拷贝,并删除了指定的属性。如果 `inOutboundList` 存在,则还会删除其内部的 `createTime` 和 `updateTime` 属性。最终,我们渲染更新后的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值