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. flask url_for的用法

    from flask import Flask,url_for app = Flask(__name__) @app.route('/') def hello_world(): print(url_f ...

  2. mv 命令 移动或重命名文件

    mv 命令 移动或重命名文件 [root@localhost soft]# .txt [root@localhost soft]# [root@localhost soft]# ls .txt [ro ...

  3. input type=file accept中文件格式限制

    原文链接:https://blog.csdn.net/usuallyuser/article/details/83060341 accept="application/msexcel,app ...

  4. zabbix监控大数据

    参考: https://github.com/Staroon/zabbix-hadoop-template 支持监控HDFS.NameNode, YARN ResourceManager, Hive, ...

  5. Spring JdbcTemplate 和 NamedParameterJdbcTemplate 使用

    1.简单介绍 DAO层 的一般使用常见的是MyBatis 和 Hibernate,但是Hibernate是重量级的,而且学习成本较高,Mybatis 需要编写大量配置文件及接口文件,对于简单的项目应用 ...

  6. tarjan算法求无向图的桥、边双连通分量并缩点

    // tarjan算法求无向图的桥.边双连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> ...

  7. [.net core]3. Project 文件简介

    这是一个C#的空的.net core web app .net frame work的.csproj 要编辑的话,得先卸载项目,  .net core的.csproje不必要, .csproj 的文件 ...

  8. [Wpf]在C#中添加 collectionViewSource

    Products = new ObservableCollection<Product>(products); ProductOptions = new ObservableCollect ...

  9. Oracle及SQLPLUS使用笔记

    Oracle及SQLPLUS使用笔记 自己之前粗粗的学过MySQL,学校用的是Oracle,学生使用sqlplus,这是个命令行界面的数据库管理软件(为了学习嘛,不用图形化可以理解),这里记录一些使用 ...

  10. 常用插件html

    1.上传模板,插件 https://github.com/kartik-v/bootstrap-fileinput 2.