Linux下网络编程-简易Epll服务器和客户端

news/2024/11/17 2:43:28/

Linux下网络编程-简易Epll服务器和客户端

简易Epll服务器:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/epoll.h>#define BUF_SIZE 100
#define EPOLL_SIZE 50
void error_handling(const char *buf);int main(int argc, char *argv[])
{if(argc!=2) {printf("Usage : %s <port>\n", argv[0]);exit(1);}int serv_sock, clnt_sock;struct sockaddr_in serv_adr, clnt_adr;socklen_t adr_sz;int str_len, i;char buf[BUF_SIZE];serv_sock=socket(PF_INET, SOCK_STREAM, 0);memset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family=AF_INET;serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);serv_adr.sin_port=htons(atoi(argv[1]));if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))==-1)error_handling("bind() error");if(listen(serv_sock, 5)==-1)error_handling("listen() error");epoll_event event;int epfd,event_count;epfd=epoll_create(100);if(epfd==-1){error_handling("epoll_create() failed");close(serv_sock);}epoll_event* all_events=new epoll_event[EPOLL_SIZE];event.events=EPOLLIN;//默认是设置条件触发方式event.data.fd=serv_sock;epoll_ctl(epfd,EPOLL_CTL_ADD,serv_sock,&event);while(1){event_count=epoll_wait(epfd,all_events,EPOLL_SIZE,-1);if(event_count==-1){puts("epoll_wait() error\n");break;}for(int i=0;i<event_count;i++){if(all_events[i].data.fd==serv_sock){adr_sz=sizeof(clnt_adr);clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_adr,&adr_sz);event.events=EPOLLIN;event.data.fd=clnt_sock;epoll_ctl(epfd,EPOLL_CTL_ADD,clnt_sock,&event);printf("connected client: %d \n", clnt_sock);}else{str_len=read(all_events[i].data.fd,buf,BUF_SIZE);if(str_len==0)//关闭请求{epoll_ctl(epfd,EPOLL_CTL_DEL,all_events[i].data.fd,NULL);close(all_events[i].data.fd);printf("closed client:%d\n",all_events[i].data.fd);}   else{write(all_events[i].data.fd,buf,BUF_SIZE);}}}}delete[] all_events;close(serv_sock);close(epfd);return 0;
}void error_handling(const char *buf)
{fputs(buf, stderr);fputc('\n', stderr);exit(1);
}
简易客户端:
//编译命令:g++ -g PThreadSocketClient.cpp -o PThreadSocketClient -lpthread
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>#define BUF_SIZE 100
#define NAME_SIZE 20char name[NAME_SIZE]="[DEFAULT]";
char msg[BUF_SIZE];void* send_msg(void * arg);
void* recv_msg(void * arg);
void error_handling(const char * msg);int main(int argc, char *argv[])
{int sock;struct sockaddr_in serv_addr;pthread_t snd_thread, rcv_thread;void * thread_return;if(argc!=4) {printf("Usage : %s <IP> <port> <name>\n", argv[0]);exit(1);}sprintf(name, "[%s]", argv[3]);sock=socket(PF_INET, SOCK_STREAM, 0);memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=inet_addr(argv[1]);serv_addr.sin_port=htons(atoi(argv[2]));if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)error_handling("connect() error");pthread_create(&snd_thread,NULL,send_msg,(void*)&sock);pthread_create(&rcv_thread,NULL,recv_msg,(void*)&sock);pthread_join(snd_thread,&thread_return);pthread_join(rcv_thread,&thread_return);close(sock);return 0;
}void* send_msg(void * arg)
{int sock=*(int *)arg;char name_msg[NAME_SIZE+BUF_SIZE];while(1){fgets(msg,BUF_SIZE,stdin);if(!strcmp(msg,"q\n")||!strcmp(msg,"Q\n")){close(sock);exit(0);}sprintf(name_msg,"%s %s",name,msg);write(sock,name_msg,strlen(name_msg));}return NULL;
}void* recv_msg(void * arg)
{int sock=*(int *)arg;char name_msg[NAME_SIZE+BUF_SIZE];int str_len;while(1){str_len=read(sock,name_msg,NAME_SIZE+BUF_SIZE-1);if(str_len==-1){return (void*)-1;}name_msg[str_len]=0;fputs(name_msg,stdout);}return NULL;
}void error_handling(const char * msg)
{fputs(msg, stderr);fputc('\n', stderr);exit(1);
}

http://www.ppmy.cn/news/1456049.html

相关文章

Llama3-Tutorial之XTuner微调Llama3个人小助手

Llama3-Tutorial之XTuner微调Llama3个人小助手 使用XTuner微调llama3模型。 参考&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 1. web demo部署 参考上一节内容已经完成web demo部署&#xff0c;进行对话测试, 当前回答基于llama3官方发布的模型进行推理生成&…

[Linux深度学习笔记4.28]

隐藏权限 : 防止root用户误操作删除, 查看隐藏权限 : lsattr设置隐藏权限 : chattrchattr a : 可以追加内容,不能编辑不能删除chattr i : 不能编辑不能删除文件chattr A :文件访问时间固定下来stat : 查看文件的详细信息 进程管理 : 进程 : 一个正在运行的程序,主进程,子进程线…

MES系统:优化生产执行,实现高效、灵活的制造管理

MES系统作为操作执行层可以缩短排产周期&#xff0c;解决紧急插单问题&#xff1b;通过计划、采集、管控等功能来改进生产执行&#xff1b;与实际生产即时接轨车间时间驱动上层的商务活动。 MES系统包含基础数据、物料和工艺管理、生产过程管理、APS排产、人员管理、设备与工具…

ue引擎游戏开发笔记(33)——武器与角色的匹配,将新武器装备到角色身上

1.需求分析&#xff1a; 武器能出现在世界中&#xff0c;完成了第一步&#xff0c;下一步需要角色和武器适配&#xff0c;即不论角色跑动&#xff0c;射击等&#xff0c;武器和角色都相匹配&#xff0c;将武器装备到角色身上。 2.操作实现&#xff1a; 1.首先先把角色原有的武…

论文笔记ColdDTA:利用数据增强和基于注意力的特征融合进行药物靶标结合亲和力预测

ColdDTA发表在Computers in Biology and Medicine 的一篇一区文章 突出 • 数据增强和基于注意力的特征融合用于药物靶点结合亲和力预测。 • 与其他方法相比&#xff0c;它在 Davis、KIBA 和 BindingDB 数据集上显示出竞争性能。 • 可视化模型权重可以获得可解释的见解。 …

Go Web 开发 Demo【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言&#xff08;Gin&#xff09;开发Web程序&#xff0c;前端太弱了&#xff0c;得好好补补课&#xff0c;完了再来更新。 1、环境准备 新建项目&#xff0c;生成 go.mod 文件&#xff1a; 出现报错&#xff1a;go: modules disabled by G…

17.Blender RC大佬EEVEE皮肤节点预设导入

如何添加节点预设 在底下的左下角打开Geometry Node Editor 选中正方体&#xff0c;点击新建 当鼠标指针在两个模块之间&#xff0c;是十字的样子时 可以拖出一个新的板块 然后打开文件浏览器 找到节点预设然后拖入到底下的节点编辑界面就可以了或者是blend文件&#xf…

解释Java的内存模型,特别是堆(Heap)和栈(Stack)

Java的内存模型定义了如何在Java虚拟机&#xff08;JVM&#xff09;中处理数据的存储和动态分配。这个内存模型主要由两个部分组成&#xff1a;栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;&#xff0c;此外还有方法区&#xff08;Method Area&#xff09…