IO模型之epoll实现服务器客户端收发

这篇具有很好参考价值的文章主要介绍了IO模型之epoll实现服务器客户端收发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 epoll.ser


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/epoll.h>

#define ERR_MSG(msg)                  \
	{                                 \
		printf("__%d__\n", __LINE__); \
		perror(msg);                  \
	}
#define IP "192.168.250.100"
#define PORT 12345

int main(int argc, const char *argv[])
{
	struct epoll_event event;
	struct epoll_event events[10]; // 存放就绪事件描述符的数组

	// 创建流式套接字
	int sfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}
	printf("socket success\n");

	// 允许端口快速被复用
	int reuse = 1;
	if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
	{
		ERR_MSG("setsockopt");
		return -1;
	}

	// 绑定服务器的IP和端口
	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("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;
	struct sockaddr_in savecin[1024];
	socklen_t len = sizeof(cin);
	char s[128] = "";
	char s1[128] = "";
	ssize_t res = 0;
	int num;
	int newfd, epfd;

	epfd = epoll_create(1);
	if (epfd < 0)
	{
		printf("epoll_create filed\n");
		exit(-1);
	}

	// 将套接字添加到红黑树
	event.events = EPOLLIN;
	event.data.fd = sfd;
	if (epoll_ctl(epfd, EPOLL_CTL_ADD, sfd, &event) < 0)
	{
		printf("epoll_ctl add filed\n");
	}

	while (1)
	{
		int i;
		int ret = epoll_wait(epfd, events, 10, -1);
		if (ret < 0)
		{
			printf("epoll_wait filed\n");
			exit(-1);
		}

		for (i = 0; i < ret; i++)
		{
			if (events[i].data.fd == sfd) // 套接的文件描述符 来客户端了
			{
				newfd = accept(sfd, (struct sockaddr *)&cin, &len);
				if (newfd < 0)
				{
					ERR_MSG("accept");
					return -1;
				}
				bzero(s1, sizeof(s1));
				printf("客户端连接成功\n");

				savecin[newfd] = cin;
				// 添加准备就绪事件进入epoll;
				event.events = EPOLLIN; // 读事件
				event.data.fd = newfd;
				if (epoll_ctl(epfd, EPOLL_CTL_ADD, newfd, &event) < 0)
				{
					printf("epoll_ctl add filed\n");
				}
			}
			else
			{
				if (events[i].events & EPOLLIN)
				{
					int fd1 = events[i].data.fd;
					bzero(s, sizeof(s));
					res = recvfrom(events[i].data.fd, s, sizeof(s), 0, NULL, NULL);
					if (0 == res)
					{
						printf("客户端关闭\n");
						close(i);
						if (epoll_ctl(epfd, EPOLL_CTL_DEL, fd1, &event) < 0)
						{
							printf("epoll_ctl sub filed\n");
						}
					}
					else if (res < 0)
					{
						ERR_MSG("recv");
						return -1;
					}
					printf("接收到的内容是:%s\n", s);
					printf("请输入要发送的内容:");

					scanf("%s", s1);
					if (write(events[i].data.fd, s1, sizeof(s1)) < 0)
					{
						ERR_MSG("write");
					}
					printf("发送成功\n");
				}
			}
		}
	}

	if (close(sfd) < 0)
	{
		ERR_MSG("close");
		return -1;
	}
	return 0;
}

epoll.cri

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/epoll.h>

#define ERR(msg)                      \
	{                                 \
		printf("__%d__\n", __LINE__); \
		perror(msg);                  \
		return -1;                    \
	}
#define PORT 12345
#define IP "192.168.250.100"

int main(int argc, const char *argv[])
{
	
	//  创建套接字
	int fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd < 0)
	{
		ERR("socket");
	}
	printf("socket success\n");

	// 连接服务器
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);
	socklen_t len = sizeof(sin);

	if (connect(fd, (struct sockaddr *)&sin, len) < 0)
	{
		ERR("connect");
	}
	printf("connect success\n");

	// 读取数据
	char s[128] = "";
	char s1[128] = "";
	ssize_t res = 0;
	int num;

	while (1)
	{
		printf("请输入要发送的内容:");
		
		scanf("%s", s1);
		if (write(fd, s1, sizeof(s1)) < 0)
		{
			ERR("write");
		}
		printf("发送成功\n");
		res = recvfrom(fd, s, sizeof(s), 0, NULL, NULL);
		printf("接收的内容:%s\n",s);
	}

	if (close(fd) < 0)
	{
		ERR("close");
	}

	return 0;
}

result

 IO模型之epoll实现服务器客户端收发,服务器,算法,运维

 文章来源地址https://www.toymoban.com/news/detail-645640.html

 

到了这里,关于IO模型之epoll实现服务器客户端收发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【TCP服务器的演变过程】使用IO多路复用器epoll实现TCP服务器

    手把手教你从0开始编写TCP服务器程序,体验开局一块砖,大厦全靠垒。 为了避免篇幅过长使读者感到乏味,对【TCP服务器的开发】进行分阶段实现,一步步进行优化升级。 本节,在上一章节的基础上,将IO多路复用机制select改为更高效的IO多路复用机制epoll,使用epoll管理每

    2024年01月17日
    浏览(49)
  • Linux多路IO复用技术——epoll详解与一对多服务器实现

    本文详细介绍了Linux中epoll模型的优化原理和使用方法,以及如何利用epoll模型实现简易的一对多服务器。通过对epoll模型的优化和相关接口的解释,帮助读者理解epoll模型的工作原理和优缺点,同时附带代码实现和图解说明。

    2024年02月05日
    浏览(33)
  • TCP实现服务器和客户端通信

    目录 TCP介绍 代码实现 server(服务器端) 代码分析 client(客户端) 代码分析 结果展示 TCP (Transmission Control Protocol) 是一种面向连接的协议,用于在计算机网络中传输数据。TCP 可以确保数据的可靠传输,即使在网络环境不稳定的情况下也能够保证数据的完整性和顺序。以下是

    2024年02月15日
    浏览(44)
  • QT实现tcp服务器客户端

    2024年02月07日
    浏览(42)
  • Qt实现客户端与服务器消息发送

    里用Qt来简单设计实现一个场景,即: (1)两端:服务器QtServer和客户端QtClient (2)功能:服务端连接客户端,两者能够互相发送消息,传送文件,并且显示文件传送进度。 环境:VS20013 + Qt5.11.2 + Qt设计师 先看效果: 客户端与服务器的基本概念不说了,关于TCP通信的三次握

    2024年02月11日
    浏览(41)
  • TCP通信实现客户端向服务器发送图片

    TCP通信: 1. TCP 协议通信交互流程: 具体的流程如下: (1)服务器根据地址类型(ipv4、ipv6)、socket 类型、协议创建 socket. (2)服务器为 socket 绑定 ip 地址和端口号。 (3)服务器 socket 监听端口号的请求,随时准备接受来自客户端的连接,此时服务器的 socket 处于关闭状态

    2024年02月13日
    浏览(45)
  • QT实现TCP通信(服务器与客户端搭建)

    创建一个QTcpServer类对象,该类对象就是一个服务器 调用listen函数将该对象设置为被动监听状态,监听时,可以监听指定的ip地址,也可以监听所有主机地址,可以通过指定端口号,也可以让服务器自动选择 当有客户端发来连接请求时,该服务器会自动发射一个newConnection信号

    2024年02月09日
    浏览(41)
  • 【网络编程】实现UDP/TCP客户端、服务器

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、UDP 1、Linux客户端、服务器 1.1udpServer.hpp 1.2udpServer.cc 1.3udpClient.hpp 1.4udpClient.cc 1.5onlineUser.hpp 2、Windows客户端 二、T

    2024年02月06日
    浏览(45)
  • Socket实现服务器和客户端(手把手教会)

    😎 作者介绍:我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun,视频号:AI-行者Sun 🎈 本文专栏:本文收录于《网络编程实战》系列专栏,相信一份耕耘一份收获,我会手把手教分享网络编程实战内容,届时可以拳打字节,

    2024年04月12日
    浏览(37)
  • 多路IO—POll函数,epoll服务器开发流程

    \\\"在计算机网络编程中,多路IO技术是非常常见的一种技术。其中,Poll函数和Epoll函数是最为常用的两种多路IO技术。这两种技术可以帮助服务器端处理多个客户端的并发请求,提高了服务器的性能。本文将介绍Poll和Epoll函数的使用方法,并探讨了在服务器开发中使用这两种技

    2024年02月06日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包