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 ...
随机推荐
- xshell登陆后脚本
vbs的写法: Sub Main xsh.Screen.Send "ssh 用户名@服务器地址" xsh.Screen.Send VbCr xsh.Screen.WaitForSt ...
- 【Linux 网络编程】数据在网络中传输过程(以ping命令为例)
(1)应用程序ping会判断发送的是主机名还是IP地址,调用函数gethostbyname()解析主机B,将主机转换为一个32位的 IP地址.这个过程叫做DNS域名解析. (2)ping程序向目 ...
- Tomcat使用时出现的问题总结
1.有两种办法解决Tomcat启动时端口号冲突问题 1.第一种: 查看本地端口使用情况,找到被占用的8080端口,杀死该进程 1.查看本地端口命令:cmd->netstat -ano 2.找到 ...
- python变量的内存管理
python变量的内存管理 一.变量存在了哪里? 先让我们来看一段代码: height = 100 # 定义变量 # print(100) # print会自动帮你创建一个变量100,打印完之后,马上 ...
- C# 方法,属性,字段
以前是学C++的,初次学微软的C#头都大了.什么字段,常量,属性,方法......微软把别人的东西拿来糅合在C#里,弄成了一个“大杂烩”.其实,说到底,“字段”不就是“变量”吗,所谓的“方法”不就是“ ...
- IA-32 Assembly Language Reference Manual
Load Full Pointer (lds,les, lfs, lgs, and lss) lds{wl} mem[32|48], reg[16|32]les{wl} mem[32|48], reg ...
- 在docker下运行mysql
docker pull mysql 从镜像仓库中拉取mysql镜像. 运行镜像 到此mysql在docker容器下运行成功. 使用Navicat连接工具连接到mysql 经过以上步骤就完成了在dock ...
- 苹果预热 WWDC 2019
Erika Hairston 是一位来自旧金山的 23 岁耶鲁大学毕业生,她的首款 app Zimela 刚刚上线.这款应用主要为了宣传科技行业的多样性.Hairston 设计的 Zimela 通过建 ...
- 终于明白上一篇的一顿误操作是什么了,是$,不是S !!!!!
1,在命令行中输入export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin这样可以保证命令行命令暂时可以使用.命令执行完之后先不要关闭终端2. ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...