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 ...
随机推荐
- JS 截取字符的方法
substr() 方法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符. stringObject.substr(start,length) start:必需.要抽取的 ...
- python 爬取网页内的代理服务器列表(需调整优化)
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-30 20:38:23 # @Author : EnderZhou (z ...
- deepin下安装Qt5&以及部分问题解决
deepin安装Qt5 1 deepin商店里的Qt5版本太低,可以直接下载官方的Qt5安装包: 官方下载渠道:http://www.qt.io/download-open-source/ 离线镜像下 ...
- C语言作业09
问题 答案 这个作业属于那个课程 C语言程序设计 这个作业要求在哪里 https://i.cnblogs.com/EditPosts.aspx?opt=1 我在这个课程的目标是 在学好C语言编程的基础 ...
- HDU 1171 Big Event in HDU (动态规划、01背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Spring Boot常用功能
1.Spring Boot打war包配置 利用IDEA将SpringBoot的项目打包成war文件
- SCP,scp linux2台机器之间如何传输文件
关键词:scp 转自: http://blog.csdn.net/gatieme https://blog.csdn.net/gatieme/article/details/51673229 scp传 ...
- Atomic实现原子性源码分析:CAS(比较并交换)、Unsafe类
1.CAS: 比较并交换(Compare And Swap),是Unsafe类中的一条CPU系统原语,原语的执行必须是连续的,在执行过程中不允许被中断,即CAS是一条CPU的原子指令,不会造成数据不一 ...
- 【6.18校内test】T1多项式输出
日常题前废话: 首先so amazing 的一件事,因为在洛谷上立下了的flag,然后这次考试前两道题都是刚刚做过不久的题emmm(相当于白送200吗qwq,但是这阻挡不了我第三题不会的脚步qwq) ...
- MySQL总结(4)
insert 数据的插入 INSERT插入数据