select客户端模型封装——回调方式快速建立客户端
SockClient.h
#pragma once #include<functional> #define _WINDOWS
#ifdef _WINDOWS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#ifndef _WINSOCK2_H
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#endif
#ifndef _WINDOWS_H
#include<Windows.h>
#endif
#endif class SocketClient
{
private :
struct sockaddr_in ServerAddr;
SOCKET s;
bool stopFlag = false; public:
SocketClient();
~SocketClient();
int connectServer(char *addr,int port);
int sendToServer(char *buf, int len);
int recvFromServer(char *buf, int len);
void startRecv(std::function<void ()> recvEvent,std::function<void()> breakEvent);
};
SocketClient.cpp
#include "SocketClient.h" SocketClient::SocketClient()
{
WORD var = MAKEWORD(, );
WSADATA wsaData;
WSAStartup(var, &wsaData); this->s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
this->ServerAddr.sin_family = AF_INET; } SocketClient::~SocketClient()
{
closesocket(s);
WSACleanup();
} /*
*
* 连接到客户端
* 成功返回0 失败返回-1
*
*/
int SocketClient::connectServer(char * addr, int port)
{
this->ServerAddr.sin_port = htons(port);
this->ServerAddr.sin_addr.S_un.S_addr = inet_addr(addr); int ret = connect(s, (const sockaddr*)&this->ServerAddr, sizeof(struct sockaddr_in)); return ret;
} int SocketClient::sendToServer(char * buf, int len)
{
return send(this->s, buf, len, );
} int SocketClient::recvFromServer(char * buf, int len)
{
return recv(this->s, buf, len, );
} void SocketClient::startRecv(std::function<void()> recvEvent, std::function<void()> breakEvent)
{
this->stopFlag = true;
while (true)
{
if (stopFlag)break; fd_set readSet;
FD_ZERO(&readSet);
FD_SET(this->s, &readSet); int ret = select(this->s, &readSet, , , ); if (ret < ) {
//Connect breaks
breakEvent();
break;
}
else if (ret == ) {
//No Message
continue;
}
//Have Message
if (FD_ISSET(&readSet, this->s))
{
FD_CLR(this->s, &readSet);
recvEvent();
}
}
}
main.cpp
#include <iostream>
#include <cstring>
#include <functional> #define _WINDOWS #include "SocketClient.h" using namespace std; char IP[] = "127.0.0.1";
int Port = ;
int abc; int main()
{
SocketClient *Client = new SocketClient();
cout << "正在连接..." << endl;
if (Client->connectServer(IP, Port) != )
{
cout<< "连接失败" <<endl;
cin >> abc;
return ;
}
cout << "连接成功" << endl;
Client->startRecv([Client]() -> void {
char buf[];
int n = Client->recvFromServer(buf, );
if (n > ) {
buf[n] = '\0';
cout << "Recv: " << buf << endl;
}
}, []() -> void {
cout << "Connect break;" << endl;
});
cin >> abc;
return ;
}
select客户端模型封装——回调方式快速建立客户端的更多相关文章
- select服务器端模型封装——回调方式快速建立服务端
#pragma once #ifndef WINSOCK2_H #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WinSock2.h> # ...
- 跨平台的游戏客户端Socket封装,调整
原文链接:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019359.html 头文件: #pragma once #ifdef WIN32 ...
- 如何快速建立Subversion服务器
本文拷贝自网址:http://www.subversion.org.cn/?action-viewnews-itemid-1 如何快速建立Subversion服务器,并且在项目中使用起来,这是大家最关 ...
- select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)
一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...
- WebService学习整理(一)——客户端三种调用方式整理
1 WebService基础 1.1 作用 1, WebService是两个系统的远程调用,使两个系统进行数据交互,如应用: 天气预报服务.银行ATM取款.使用邮箱账号登录各网站等. 2, ...
- tp5模型事件回调函数中不能使用$this
tp5模型事件回调函数中不能使用$this,使用会报错,涉及到数据库操作使用Db类,不能使用$this->save()之类的方式 如果回调函数中需要使用类内函数,需要将函数定义为static,通 ...
- Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比
Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...
- Oracle 数据库(oracle Database)Select 多表关联查询方式
Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...
- api接口对于客户端的身份认证方式以及安全措施
转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsession ...
随机推荐
- JSR303 校验扩展(分组、按顺序校验)
1.在spring MVC 项目中使用JSR303 校验数据合法性,一般情况下使用方法为 (1)在接受数据的实体使用注解标添加校验规则 package com.hzsj.wechatdto; impo ...
- MySQL -1- 简介及安装
第一章 MySQL 大纲介绍 1.官方定义的MySQL DBA工作内容 (1)运维DBA 初级:各版本.各平台安装搭建.升级 中级:体系结构原理.基础管理(启动关闭.初始化配置文件管理.多实例管理.用 ...
- 【6.18校内test】T3细胞分裂
尽管T1T2很简单,但还是阻止不了我T3wa一片 细胞分裂[题目链接] xcg同学有一个80pts的代码 他说他的代码和我的很像,可惜我比较笨,只有30pts 其实这道题考场上是想到要分解质因数了,然 ...
- hibernate-HQL连接查询 转载sincoolvip
和SQL查询一样,HQL也支持各种各样的连接查询,如内连接.外连接 连接类型 HQL语法内连接 inner join 或者join迫切内连接 inner join fetch 或join fetch左 ...
- python 类(2)
""" """class BaseCat(object): """ 猫科基础类""&quo ...
- CSS 相对定位 绝对定位
css中的相对定位和绝对定位. 定位标签:position 包含属性:relative(相对) absolute(绝对) 1.position:relative; 如果对一个元素进行相对定位,首先它将 ...
- python 元类 MetaClass
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hel ...
- 手把手带你了解sass
sass的使用 减少重复的工作 1.变量的声明: 是以$开头给变量命名; $height-color: #F30 2.变量的使用范围: 变量可以在多个地方存在,不一定限制在代码块中.但是如果定义在了代 ...
- 2-Elasticsearch原理
参考知乎大佬:https://zhuanlan.zhihu.com/p/62892586 一.倒排索引 倒排索引也叫反向索引,举个例子,理解一下.叫你背一首<静夜思>,立马可以背出,但是叫 ...
- vue-cli解决兼容ie的es6+api问题
官网:https://cli.vuejs.org/zh/guide/browser-compatibility.html#usebuiltins-usage https://github.com/vu ...