SockClient.h

  1. #pragma once
  2.  
  3. #include<functional>
  4.  
  5. #define _WINDOWS
  6. #ifdef _WINDOWS
  7. #define _WINSOCK_DEPRECATED_NO_WARNINGS
  8. #ifndef _WINSOCK2_H
  9. #include<WinSock2.h>
  10. #pragma comment(lib,"ws2_32.lib")
  11. #endif
  12. #ifndef _WINDOWS_H
  13. #include<Windows.h>
  14. #endif
  15. #endif
  16.  
  17. class SocketClient
  18. {
  19. private :
  20. struct sockaddr_in ServerAddr;
  21. SOCKET s;
  22. bool stopFlag = false;
  23.  
  24. public:
  25. SocketClient();
  26. ~SocketClient();
  27. int connectServer(char *addr,int port);
  28. int sendToServer(char *buf, int len);
  29. int recvFromServer(char *buf, int len);
  30. void startRecv(std::function<void ()> recvEvent,std::function<void()> breakEvent);
  31. };

SocketClient.cpp

  1. #include "SocketClient.h"
  2.  
  3. SocketClient::SocketClient()
  4. {
  5. WORD var = MAKEWORD(, );
  6. WSADATA wsaData;
  7. WSAStartup(var, &wsaData);
  8.  
  9. this->s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  10. this->ServerAddr.sin_family = AF_INET;
  11.  
  12. }
  13.  
  14. SocketClient::~SocketClient()
  15. {
  16. closesocket(s);
  17. WSACleanup();
  18. }
  19.  
  20. /*
  21. *
  22. * 连接到客户端
  23. * 成功返回0 失败返回-1
  24. *
  25. */
  26. int SocketClient::connectServer(char * addr, int port)
  27. {
  28. this->ServerAddr.sin_port = htons(port);
  29. this->ServerAddr.sin_addr.S_un.S_addr = inet_addr(addr);
  30.  
  31. int ret = connect(s, (const sockaddr*)&this->ServerAddr, sizeof(struct sockaddr_in));
  32.  
  33. return ret;
  34. }
  35.  
  36. int SocketClient::sendToServer(char * buf, int len)
  37. {
  38. return send(this->s, buf, len, );
  39. }
  40.  
  41. int SocketClient::recvFromServer(char * buf, int len)
  42. {
  43. return recv(this->s, buf, len, );
  44. }
  45.  
  46. void SocketClient::startRecv(std::function<void()> recvEvent, std::function<void()> breakEvent)
  47. {
  48. this->stopFlag = true;
  49. while (true)
  50. {
  51. if (stopFlag)break;
  52.  
  53. fd_set readSet;
  54. FD_ZERO(&readSet);
  55. FD_SET(this->s, &readSet);
  56.  
  57. int ret = select(this->s, &readSet, , , );
  58.  
  59. if (ret < ) {
  60. //Connect breaks
  61. breakEvent();
  62. break;
  63. }
  64. else if (ret == ) {
  65. //No Message
  66. continue;
  67. }
  68. //Have Message
  69. if (FD_ISSET(&readSet, this->s))
  70. {
  71. FD_CLR(this->s, &readSet);
  72. recvEvent();
  73. }
  74. }
  75. }

main.cpp

  1. #include <iostream>
  2. #include <cstring>
  3. #include <functional>
  4.  
  5. #define _WINDOWS
  6.  
  7. #include "SocketClient.h"
  8.  
  9. using namespace std;
  10.  
  11. char IP[] = "127.0.0.1";
  12. int Port = ;
  13. int abc;
  14.  
  15. int main()
  16. {
  17. SocketClient *Client = new SocketClient();
  18. cout << "正在连接..." << endl;
  19. if (Client->connectServer(IP, Port) != )
  20. {
  21. cout<< "连接失败" <<endl;
  22. cin >> abc;
  23. return ;
  24. }
  25. cout << "连接成功" << endl;
  26. Client->startRecv([Client]() -> void {
  27. char buf[];
  28. int n = Client->recvFromServer(buf, );
  29. if (n > ) {
  30. buf[n] = '\0';
  31. cout << "Recv: " << buf << endl;
  32. }
  33. }, []() -> void {
  34. cout << "Connect break;" << endl;
  35. });
  36. cin >> abc;
  37. return ;
  38. }

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. JS 截取字符的方法

    substr() 方法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符. stringObject.substr(start,length) start:必需.要抽取的 ...

  2. python 爬取网页内的代理服务器列表(需调整优化)

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-30 20:38:23 # @Author : EnderZhou (z ...

  3. deepin下安装Qt5&以及部分问题解决

    deepin安装Qt5 1 deepin商店里的Qt5版本太低,可以直接下载官方的Qt5安装包: 官方下载渠道:http://www.qt.io/download-open-source/ 离线镜像下 ...

  4. C语言作业09

    问题 答案 这个作业属于那个课程 C语言程序设计 这个作业要求在哪里 https://i.cnblogs.com/EditPosts.aspx?opt=1 我在这个课程的目标是 在学好C语言编程的基础 ...

  5. 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 ...

  6. Spring Boot常用功能

    1.Spring Boot打war包配置 利用IDEA将SpringBoot的项目打包成war文件

  7. SCP,scp linux2台机器之间如何传输文件

    关键词:scp 转自: http://blog.csdn.net/gatieme https://blog.csdn.net/gatieme/article/details/51673229 scp传 ...

  8. Atomic实现原子性源码分析:CAS(比较并交换)、Unsafe类

    1.CAS: 比较并交换(Compare And Swap),是Unsafe类中的一条CPU系统原语,原语的执行必须是连续的,在执行过程中不允许被中断,即CAS是一条CPU的原子指令,不会造成数据不一 ...

  9. 【6.18校内test】T1多项式输出

    日常题前废话: 首先so amazing 的一件事,因为在洛谷上立下了的flag,然后这次考试前两道题都是刚刚做过不久的题emmm(相当于白送200吗qwq,但是这阻挡不了我第三题不会的脚步qwq) ...

  10. MySQL总结(4)

    insert 数据的插入 INSERT插入数据