linux,socket编程,select,poll,epoll学习

news/2024/10/24 2:52:36/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> // 添加这一行
#include <string.h>    // 添加这一行
#include <pthread.h>
#include <poll.h>
#include <sys/epoll.h>void *handle_client(void *arg)
{int clientfd = *(int *)arg;char buf[1024];printf("clientfd:%d\n", clientfd);while (1){memset(buf, 0, sizeof(buf));int ret = recv(clientfd, buf, sizeof(buf), 0);if (ret <= 0){printf("客户端断开连接\n");break;}printf("recv:%s\n", buf);char ans[] = "yesmefasrefas";int len = sizeof(ans);send(clientfd, ans, len, 0);}close(clientfd);
}
int main()
{// 创建socket_fd;printf("创建socket\n");int socketfd = socket(AF_INET, SOCK_STREAM, 0);if (socketfd < 0){perror("socket");return -1;}// 绑定ip地址printf("绑定ip\n");struct sockaddr_in serveraddr;memset(&serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9999);serveraddr.sin_addr.s_addr = inet_addr("0.0.0.0");if (bind(socketfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0){perror("bind");return -1;}listen(socketfd, 10);printf("等待客户端连接\n");struct sockaddr_in clientaddr;int len = sizeof(clientaddr);printf("sockfd:%d\n", socketfd);#if 0int clientfd = accept(socketfd, (struct sockaddr *)&clientaddr, &len);printf("客户端连接成功\n");char client_ip[INET_ADDRSTRLEN];inet_ntop(AF_INET, &(clientaddr.sin_addr), client_ip, INET_ADDRSTRLEN);printf("Client connected from IP: %s\n", client_ip);#endif#if 0//多线程while (1){int clientfd = accept(socketfd, (struct sockaddr *)&clientaddr, &len);printf("客户端连接成功\n");pthread_t pid_t;pthread_create(&pid_t, NULL, handle_client, &clientfd);}
#endif
#if 0// select();fd_set rfds, rset;FD_ZERO(&rfds);          // 全部置0FD_SET(socketfd, &rfds); // sockfd 置1int maxfd = socketfd;while (1){rset = rfds;int ready = select(maxfd + 1, &rset, NULL, NULL, NULL);if (FD_ISSET(socketfd, &rset)) // 判断是否在里面{int clientfd = accept(socketfd, (struct sockaddr *)&clientaddr, &len);printf("有情况!clientfd: %d\n", clientfd);FD_SET(clientfd, &rfds);maxfd = clientfd;}int i = 0;for (i = socketfd + 1; i <= maxfd; i++){if (FD_ISSET(i, &rset)){printf("有数据到达了,fd:%d\n", i);char buf[1024];// printf("clientfd:%d\n", clientfd);memset(buf, 0, sizeof(buf));int ret = recv(i, buf, sizeof(buf), 0);if (ret <= 0){printf("客户端断开连接\n");break;}printf("recv:%s\n", buf);char ans[] = "yesmefasrefas";int len = sizeof(ans);send(i, ans, len, 0);FD_CLR(i, &rfds);close(i);}}}#endif#if 0// poll();struct pollfd fds[1024];fds[socketfd].fd = socketfd;fds[socketfd].events = POLLIN;int maxfd = socketfd;while (1){poll(fds, 1024, socketfd);if (fds[socketfd].revents & POLLIN){int clientfd = accept(socketfd, (struct sockaddr *)&clientaddr, &len);printf("有情况!clientfd: %d\n", clientfd);fds[clientfd].fd = clientfd;fds[clientfd].events = POLLIN;maxfd = clientfd;}int i = 0;for (i = socketfd + 1; i <= maxfd; i++){if (fds[i].revents & POLLIN){printf("有数据到达了,fd:%d\n", i);char buf[1024];// printf("clientfd:%d\n", clientfd);memset(buf, 0, sizeof(buf));int ret = recv(i, buf, sizeof(buf), 0);if (ret <= 0){printf("客户端断开连接\n");fds[i].fd = -1;fds[i].events = 0;close(i);}else{printf("recv:%s\n", buf);char ans[] = "yesmefasrefas";int len = sizeof(ans);send(i, ans, len, 0);}}}}#endif#if 1// epollint epfd = epoll_create(1024);struct epoll_event ev;ev.events = EPOLLIN;ev.data.fd = socketfd;epoll_ctl(epfd, EPOLL_CTL_ADD, socketfd, &ev);struct epoll_event events[1024];while (1){int ready = epoll_wait(epfd, events, 1024, -1);int i = 0;for (i = 0; i < ready; i++){int connfd = events[i].data.fd;if (connfd == socketfd){int clientfd = accept(socketfd, (struct sockaddr *)&clientaddr, &len);printf("有情况!clientfd: %d\n", clientfd);ev.data.fd = clientfd;ev.events = EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, clientfd, &ev);}else if (events[i].events & EPOLLIN){printf("有数据到达了,fd:%d\n", connfd);char buf[1024];// printf("clientfd:%d\n", clientfd);memset(buf, 0, sizeof(buf));int l = sizeof(buf);int ret = recv(connfd, buf, 5, 0);if (ret <= 0){printf("客户端断开连接\n");epoll_ctl(epfd, EPOLL_CTL_DEL, connfd, NULL);close(connfd);}else{printf("recv:%s\n", buf);char ans[] = "yesmefasrefas";int len = sizeof(ans);send(connfd, ans, len, 0);}}}}
#endifclose(socketfd);return 0;
}

client代码

 

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> // 添加这一行
#include <string.h>    // 添加这一行
#include <pthread.h>int main(int argc, char *argv[])
{int sockfd;struct sockaddr_in servaddr;char buf[1024];int n;sockfd = socket(AF_INET, SOCK_STREAM, 0);servaddr.sin_family = AF_INET;servaddr.sin_port = htons(9999);servaddr.sin_addr.s_addr = inet_addr("113.45.173.146");connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));char buffrecv[] = "123456789123456789123456789";send(sockfd, buffrecv, sizeof(buffrecv), 0);recv(sockfd, buf, 1024, 0);printf("recv:%s\n", buf);sleep(3);close(sockfd);return 0;
}


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

相关文章

Java知识巩固(四)

目录 线程的生命周期 一、新建状态&#xff08;New&#xff09; 二、就绪状态&#xff08;Runnable&#xff09; 三、运行状态&#xff08;Running&#xff09; 四、阻塞状态&#xff08;Blocked&#xff09; 五、死亡状态&#xff08;Dead&#xff09; 什么是双亲委派 …

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知&#xff0c;QGraphicsView&#xff0c;QGraphicsScene, QGraphicsItem&#xff0c;分别称为&#xff1a;视图&#xff0c;场景&#xff0c;图元&#xff0c;图表就是各种各样的元素&#xff0c;图片元素&#xff0c;线条元…

【橙子老哥】C# 实操分布式事务解决方案

hello&#xff0c;大家好&#xff0c;今天来到橙子老哥的分享时间&#xff0c;希望大家一起学习&#xff0c;一起进步。 欢迎加入.net意社区&#xff0c;第一时间了解我们的动态&#xff0c;文章第一时间分享至社区 社区官方地址&#xff1a;https://ccnetcore.com (上千.net…

【Hive】8-Hive性能优化及Hive3新特性

Hive性能优化及Hive3新特性 Hive表设计优化 Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时&#xff0c;默认将其转换为分布式计算 MapReduce程序对HDFS中的数据进行…

RabbitMQ进阶_可靠性

文章目录 一、 发送者的可靠性1.1、 生产者重试机制1.2、 生产者确认机制1.2.1、确认机制理论1.2.2、确认机制实现1.2.2.1、定义ReturnCallback1.2.2.2、定义ConfirmCallback 二、 MQ的可靠性2.1、 数据持久化2.1.1、 交换机持久化2.1.2、 队列持久化2.1.3、 消息持久化 2.2、 …

HTTP安全么?如何更好的保护您的网站

在互联网飞速发展的今天&#xff0c;网络安全问题日益严峻。HTTP作为最常见的网络通信协议&#xff0c;虽然在传输效率方面表现优异&#xff0c;但其安全性却常常令人担忧。许多企业和个人网站在使用HTTP进行数据传输时&#xff0c;可能忽视了其中潜在的风险。那么&#xff0c;…

kafka自定义配置信息踩坑

org.apache.kafka.common.config.ConfigException: Invalid value 0 for configuration acks: Expected value to be a string, but it was a java.lang.Integer 场景描述&#xff1a; 单个kafka使用springboot框架自带的 yml 配置完全OK&#xff08;因为底层会帮我们处理好类…

探索 JavaScript 事件机制(一):从基础概念到实战应用

前言 在现代前端开发中&#xff0c;JavaScript 事件是实现用户交互的核心机制之一。无论是按钮点击、鼠标移动还是键盘输入&#xff0c;这些用户操作都会触发特定的事件&#xff0c;从而使网页变得更加动态和响应式。然而&#xff0c;许多初学者对事件的概念和使用方法感到困惑…