simple poll echo server example

//    echo_server.cc

#include <fcntl.h>			//	fcntl
#include <stdlib.h>			//	exit
#include <sys/socket.h>		//	socket
#include <netinet/in.h>		//	sockaddr_in
#include <strings.h>		//	bzero
#include <arpa/inet.h>		//	inet_addr
#include <unistd.h>			//	read
#include <stdio.h>			//	perror
#include <poll.h>			
#include <iostream>

int main()
{
	std::cout << "start poll echo server..." << std::endl;
	
	static const int max_back_log = 10;
	static const int max_poll_fd = 2;
	struct pollfd fds[max_poll_fd];

	for(int i = 0; i < max_poll_fd; ++i)
	{	
		fds[i].fd = -1;
	}
	int listenfd = socket(AF_INET,SOCK_STREAM,0);
	if(-1 == listenfd)
	{
		perror("socket");
		exit(1);
	}

	int option_name = 1;
	if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &option_name, sizeof(int)) == -1)
	{
        perror("setsockopt");
        exit(1);
    }

	struct sockaddr_in serveraddr;
	bzero(&serveraddr,sizeof(sockaddr_in));
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(9876);
	inet_aton("127.0.0.1",&(serveraddr.sin_addr));
	if( -1 == bind(listenfd,(sockaddr*)&serveraddr,sizeof(sockaddr_in)))
	{
        perror("bind");
        exit(1);
    }

	if( -1 == listen(listenfd,max_back_log))
	{
        perror("bind");
        exit(1);
    }
	
	int cur_poll_fd_num = 0;
	fds[0].fd = 0;
	fds[0].events = POLLIN;
	++cur_poll_fd_num;

	fds[1].fd = listenfd;
	fds[1].events = POLLIN;
	++cur_poll_fd_num;
	
	int timeout_msecs = 50000;
	int connectfd = 0;
	struct sockaddr_in clientaddr;
	socklen_t	client_addr_len;
	int read_data = 0;
	int send_size = 0;
	int read_size = 0;
	while(1)
	{
		int ret = poll(fds,cur_poll_fd_num,timeout_msecs);
		if(-1 == ret)
		{
			perror("poll");
			exit(1);
		}
		else if(0 == ret)
		{
			perror("time out");
			continue;
		}
		for(int i = 0; i <cur_poll_fd_num; ++i)
		{
			if(fds[i].revents & POLLIN)
			{
				if(0 == fds[i].fd)
				{
					std::cout << read_size << " fds[i].fd = 0 " << read_data << std::endl;
				}
				else if(listenfd == fds[i].fd)
				{
					connectfd = accept(listenfd,(sockaddr*)&clientaddr,&client_addr_len);
					if(-1 == connectfd)
					{
						perror("accept");
						continue;
					}	
					fds[cur_poll_fd_num].fd = connectfd;
					fds[cur_poll_fd_num].events = POLLIN;
					++cur_poll_fd_num;
					std::cout << "new connection coming at " << inet_ntoa(clientaddr.sin_addr) << ": " << ntohs(clientaddr.sin_port) << std::endl;
				}
				else
				{
					if((read_size = read(fds[i].fd,(void*)&read_data,sizeof(int))) < 0 )
					{
						perror("read");
					}
					else
					{
						std::cout << read_size << " bytes data read: " << read_data << std::endl;
					}
					if((send_size = write(fds[i].fd,(void*)&read_data,sizeof(int))) < 0 )
					{
						perror("write");
					}
					else
					{
						std::cout << send_size << " bytes data send: " << read_data << std::endl;
					}
				}
			}
		}
	}
	return 0;
}


//    echo_client.cc

#include <stdlib.h>			//	exit
#include <netinet/in.h>		//	sockaddr_in
#include <strings.h>		//	bzero
#include <arpa/inet.h>		//	inet_addr
#include <sys/socket.h>
#include <iostream>

int main()
{
	int sock = socket(AF_INET,SOCK_STREAM,0);
	if(-1 == sock)
	{
		std::cout << "error at socket"<<std::endl;
		exit(1);
	}
	struct sockaddr_in clientaddr;
	clientaddr.sin_family = AF_INET;
	clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	clientaddr.sin_port = htons(9876);
	int res = connect(sock,(sockaddr*)&clientaddr,sizeof(sockaddr_in));
	if(-1 == res)
	{
		std::cout << "error at connect"<<std::endl;
		exit(1);
	}
	static int send_data = 1;
	for(;;)
	{
		int send_bytes = send(sock,(void*)&send_data,sizeof(int),0);
		if(-1 != send_bytes)
		{
			std::cout << send_bytes << " bytes data send: " << send_data++ << std::endl;
		}
		int recv_data = 0;
		int recv_bytes = recv(sock,(void*)&recv_data,sizeof(int),0);
		if(-1 != recv_bytes)
		{
			std::cout << recv_bytes << " bytes data recv: " << recv_data << std::endl;
		}
		sleep(1);
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值