文档章节

c++ server example

F
 FaintX
发布于 2014/05/04 00:09
字数 365
阅读 45
收藏 0
//============================================================================
// Name        : loginserver.cpp
// Author      : Faint
// Version     :
// Copyright   : TestVersion
//============================================================================
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>

#include <iostream>
using namespace std;

int createSocket()
{
	int newSocket;
	newSocket = socket( AF_INET, SOCK_STREAM, 0 );
	cout<<"socket()"<<strerror(errno)<<endl;
	if ( newSocket == -1 )
		return -1;
	return newSocket;
}

int closeSocket( int sock )
{
	return close(sock);
}

int nonBlock( int fd )
{
	int flag;
	flag = fcntl( fd, F_GETFL, 0 );
	cout<<"fcntl()"<<strerror(errno)<<endl;
	flag = flag | O_NONBLOCK;
	int result = fcntl( fd, F_SETFL, flag );
	cout<<"fcntl()"<<strerror(errno)<<endl;
	return result;
}

int BindServerSocket( int fd, int port )
{
	struct sockaddr_in sa;
	sa.sin_family = AF_INET;
	sa.sin_port = htons( port );
	sa.sin_addr.s_addr = INADDR_ANY;

	int result = bind( fd, ( struct sockaddr* )&sa, sizeof( sa ));
	cout<<"bind()"<<strerror(errno)<<endl;
	return result;
}

int handle( int fd )
{
	if (fd > 0)
	{
		cout<<"hanlde()"<<fd<<endl;
		char recv_content[100];
		int rr = recv( fd, recv_content, sizeof(recv_content), 0);
		cout<<"recv()"<<strerror(errno)<<endl;
		int a = sizeof(recv_content);
		cout<<"%s"<<a<<endl;
		cout<<recv_content<<endl;
	}
	else
	{

		return -1;
	}
	return 1;
}

int main()
{
	cout << "!!!Begin Testing!!!" << endl; // prints !!!Hello World!!!

	int loginSocket = createSocket();

	nonBlock( loginSocket );

	BindServerSocket( loginSocket, 5768 );

	listen( loginSocket, 64 );
	cout<<"listen()"<<strerror(errno)<<endl;;


	int eSocket = epoll_create( 256 );
	cout<<"epoll_create()"<<strerror(errno)<<endl;

	int nfds;
	int n;
	struct epoll_event ev;
	struct epoll_event events[20];

	ev.events = EPOLLIN | EPOLLET;
	ev.data.fd = loginSocket;
	epoll_ctl(eSocket, EPOLL_CTL_ADD, loginSocket, &ev);
	cout<<"epoll_ctl()"<<strerror(errno)<<endl;;

	while( 1 )
	{
		cout<<"main loop!"<<endl;
		nfds = epoll_wait( eSocket, events, 10, -1);
		cout<<"epoll_wait()"<<strerror(errno)<<endl;


		if (nfds < 0)
		{
			cout<<"nfds:"<<nfds<<";eSocket:"<<eSocket<<";events:"<<events<<endl;
			exit(1);
		}

		for ( n=0; n<nfds; ++n )
		{
			cout<<n<<endl;
			if ( events[n].data.fd == loginSocket )
			{
				struct sockaddr_in client;
				socklen_t clientSize = sizeof(client);
				int target = accept( loginSocket, (struct sockaddr*)&client, &clientSize );
				cout<<"accept()"<<strerror(errno)<<endl;
				//sleep(100000);
				nonBlock(target);
				ev.events = EPOLLIN | EPOLLET;
				ev.data.fd = target;

				epoll_ctl( eSocket, EPOLL_CTL_ADD, target, &ev );
				cout<<"epoll_ctl():EPOLL_CTL_ADD"<<strerror(errno)<<endl;
			}
			else
			{
				int result = handle(events[n].data.fd);
				if (result == -1)
				{
					epoll_ctl( eSocket, EPOLL_CTL_DEL, events[n].data.fd, &ev );
					cout<<"epoll_ctl():EPOLL_CTL_DEL"<<strerror(errno)<<endl;
					exit(1);
				}
			}

		}
	}

	closeSocket(eSocket);
	cout<<"close()"<<strerror(errno)<<endl;;

	int ifSocketClosed = closeSocket(loginSocket);
	cout<<ifSocketClosed<<endl;

	return ifSocketClosed;
}


© 著作权归作者所有

F
粉丝 2
博文 10
码字总数 5378
作品 0
厦门
私信 提问
C++ Web Programming

What is CGI ? The Common Gateway Interface, or CGI, is a set of standards that define how information is exchanged between the web server and a custom script. The CGI specs are ......

岭南六少
2011/07/21
197
0
SonarQube C/C++/Objective C 3.12 发布

SonarQube C/C++/Objective C 3.12 发布了,本次发布主要包括9个新特性: Conditions should not unconditionally evaluate to “TRUE” or to “FALSE” (C, Bug, cert, cwe, misra) Examp......

oschina
2016/06/16
2.3K
0
AfxGetInstanceHandle & AfxGetResourceHandle

AfxGetInstanceHandle This function allows you to retrieve the instance handle of the current application. HINSTANCE AFXAPI AfxGetInstanceHandle( ); Return Value An HINSTANCE to ......

Amamatthew
2014/06/24
212
0
Sublime插件“EasyClangComplete”如何配置?

本人非科班自学CS中...最近心血来潮想试试搭建Sublime下的C++开发环境,之后便发现了这个Sublime的C++语法提示插件”EasyClangComplete“,苦于基础薄弱没有办法理解这一步配置,Google无果,...

Alaya-HY
2017/05/07
710
0
SonarQube C/C++/Objective C 4.1 发布

SonarQube C/C++/Objective C 4.1 发布了,Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。支持的语言包括:Java、PHP...

局长
2016/08/25
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
712
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
26
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
75
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
73
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部