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客户端模型封装——回调方式快速建立客户端的更多相关文章

  1. select服务器端模型封装——回调方式快速建立服务端

    #pragma once #ifndef WINSOCK2_H #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WinSock2.h> # ...

  2. 跨平台的游戏客户端Socket封装,调整

    原文链接:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019359.html 头文件: #pragma once #ifdef WIN32 ...

  3. 如何快速建立Subversion服务器

    本文拷贝自网址:http://www.subversion.org.cn/?action-viewnews-itemid-1 如何快速建立Subversion服务器,并且在项目中使用起来,这是大家最关 ...

  4. select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)

    一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...

  5. WebService学习整理(一)——客户端三种调用方式整理

    1 WebService基础 1.1 作用 1,       WebService是两个系统的远程调用,使两个系统进行数据交互,如应用: 天气预报服务.银行ATM取款.使用邮箱账号登录各网站等. 2, ...

  6. tp5模型事件回调函数中不能使用$this

    tp5模型事件回调函数中不能使用$this,使用会报错,涉及到数据库操作使用Db类,不能使用$this->save()之类的方式 如果回调函数中需要使用类内函数,需要将函数定义为static,通 ...

  7. Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比

    Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...

  8. Oracle 数据库(oracle Database)Select 多表关联查询方式

    Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...

  9. api接口对于客户端的身份认证方式以及安全措施

    转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsession ...

随机推荐

  1. Maven从入门到精通(一)

    maven是一个项目管理工具,我的后续将会根据这个思维导图给大家由浅到深讲解Maven是如何管理我们的项目,以及我们如何更好的使用Maven maven在开发过程中功能主要有三个方面:   管理依赖 ...

  2. [转帖]站点部署,IIS配置优化指南

    站点部署,IIS配置优化指南 https://www.cnblogs.com/heyuquan/p/deploy-iis-set-performance-guide.html 挺值得学习的 毕竟之前很 ...

  3. jsp运行环境的安装和配置

    1.JDK的安装和配置 1)下载jdk,我下载的是1-jdk-6u26-windows-i586.exe,放在D:\StudySystem\JavaWeb\jdk目录下. 2)安装jdk,直接你下载的 ...

  4. cell_phone_network(树形dp求最小支配集)

    Cell Phone Network Farmer John has decided to give each of his cows a cell phone in hopes to encoura ...

  5. redis 字符串 数据类型

    1 字符串 设置:   set    key  value   获取:  get  key    删除:  del   key getrange   key    0 3    截取字符串内容    ...

  6. (转)终于有人把Elasticsearch原理讲透了!

    终于有人把Elasticsearch原理讲透了! 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 来源:互联网侦察 | 2019-04-08 ...

  7. ShareSdk等等(三方登录与支付冲突问题)

    1.必须实现前两个方法,第三个方法照成支付回调有问题. //必须实现的方法 - (BOOL)application:(UIApplication *)application handleOpenURL ...

  8. iOS蓝牙中的进制转换,数据格式转换

    最近在忙一个蓝牙项目,在处理蓝牙数据的时候,经常遇到进制之间的转换,蓝牙处理的是16进制(NSData),而我们习惯的计数方式是10进制,为了节省空间,蓝牙也会把16进制(NSData)拆成2进制记录 ...

  9. Spring Boot 学习杂记

    使用IntelliJ IDEA构建Spring Initializr

  10. [uboot] (第三章)uboot流程——uboot-spl代码流程(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...