1. 阻塞模型
2. 阻塞+多线程
3. select
4. 异步IO
5. IOCP
6. epoll
7. Reactor和Proactor


文章目录

  • 阻塞+多线程的服务端

在上一篇【C++ Socket编程】(一)阻塞模型 中,阻塞模型每次只能处理一个连接的数据收发,但其实socket的accept、send和recv是可以独立的,可以不需要在执行其中一个操作时阻塞另一个操作。所以我们可以在不同的线程中分别处理各个操作。

阻塞+多线程的服务端

在每次accept后,创建一个线程处理新的客户端连接。

/*
sock_server_block_thread.cpp阻塞模型+多线程
单纯的阻塞模型服务端一次只能处理单个连接当接收到客户端连接后,创建一个线程去处理此客户端的请求,可解决一次只处理一个客户端连接的问题
*/#include <iostream>
using namespace std;#include <winsock2.h>
#include <stdio.h>
#include <process.h>#pragma comment(lib, "ws2_32.lib")#define SERVERPORT 9000
#define MSG_BUF_SIZE 128
#define BACK_LOG 10 // 经过三次握手,但还没有accept的最大连接数,达到最大值后将拒绝连接unsigned int Proc(void *args);int main(int argc, char **argv)
{WSADATA wsaData;SOCKET sockServer;SOCKADDR_IN addrServer;SOCKADDR_IN addrClient;WSAStartup(MAKEWORD(2, 2), &wsaData);//创建服务端socketsockServer = socket(AF_INET, SOCK_STREAM, 0);addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //INADDR_ANY表示任何IPaddrServer.sin_family = AF_INET;addrServer.sin_port = htons(SERVERPORT); //绑定端口//绑定socketbind(sockServer, (SOCKADDR *)&addrServer, sizeof(SOCKADDR));//Listen监听端listen(sockServer, BACK_LOG); // 等待连接数目 SOMAXCONNprintf("server start:\nlistening...\n");int len = sizeof(SOCKADDR);HANDLE h_thread;while (true){//会阻塞进程,直到有客户端连接上来为止SOCKET sockClient = accept(sockServer, (SOCKADDR *)&addrClient, &len);printf("socket client connected : %s:%d\r\n", inet_ntoa(addrClient.sin_addr), addrClient.sin_port);//创建一个线程处理新的连接_beginthreadex(nullptr, 0, Proc, (void*)sockClient, 0, nullptr);}//关闭socketclosesocket(sockServer);WSACleanup();return 0;
}unsigned int Proc(void *args)
{char sendBuf[MSG_BUF_SIZE]; //发送至客户端的字符串char recvBuf[MSG_BUF_SIZE]; //接受客户端返回的字符串SOCKET sockClient = (SOCKET )args;int recv_size = -1;int send_result = -1;do{memset(recvBuf, 0, MSG_BUF_SIZE);//阻塞等待接收数据recv_size = recv(sockClient, recvBuf, MSG_BUF_SIZE, 0);if (recv_size > 0){//打印客户端数据sprintf(sendBuf, " %d this is sock server", &sockClient);send_result = send(sockClient, recvBuf, MSG_BUF_SIZE, 0);printf("%d %s %d\n", &sockClient, recvBuf, send_result);if (send_result == SOCKET_ERROR){cerr << "Failed to send message to client!Error code: " << ::GetLastError() << "\n";closesocket(sockClient);system("pause");return 1;}}else if (recv_size == 0){cout << "connection closed..." << endl;}else{printf("%d socket closed,recv_size : %d\r\n", &sockClient, recv_size);closesocket(sockClient);break;}} while (recv_size > 0);recv_size = shutdown(sockClient, SD_SEND);if (recv_size == SOCKET_ERROR){cerr << "Failed to shutdown the client socket!Error code: " << ::GetLastError() << "\n";closesocket(sockClient);system("pause");return 1;}return 0;
}

还是用上一节的sock_client_bulk.exe测试,效果好一点,感觉效果不明显,可能是我的姿势不对。

【C++ Socket编程】(二)阻塞+多线程相关推荐

  1. 【java的socket编程】结合多线程Thread实现通信(使用线程池和非线程池对比)、java开发UDP/IP网络程序

    结合多线程实现socket 使用非线程池(拓展Thread) 使用线程池(Executor pool) 使用DatagramPacket DatagramSocket开发UDP/IP程序 使用UDP获 ...

  2. socket编程 —— 非阻塞socket (转)---例子已上传至文件中

    在上一篇文章 <socket编程--一个简单的例子> http://blog.csdn.net/wind19/archive/2011/01/21/6156339.aspx 中写了一个简单 ...

  3. iphone开发之轻松搞定原生socket 编程,阻塞与非阻塞,收发自如

    iphone socket 开发 在iphone的平台下,要进行socket开发其实有很多种的方法,开源的库Asyncsocket,官方的CFSocket,还有BSD的socket. 这里要做一个简单 ...

  4. socket编程二十二:socket编程实现文件传输功能

    这节我们来完成 socket 文件传输程序,这是一个非常实用的例子.要实现的功能为:client 从 server 下载一个文件并保存到本地. 编写这个程序需要注意两个问题: 1) 文件大小不确定,有 ...

  5. educoder 使用线程锁(lock)实现线程同步_Python并行编程(二):多线程锁机制利用Lock与RLock实现线程同步

    什么是锁机制? 要回答这个问题,我们需要知道为什么需要使用锁机制.前面我们谈到一个进程内的多个线程的某些资源是共享的,这也是线程的一大优势,但是也随之带来一个问题,即当两个及两个以上的线程同时访问共享 ...

  6. socket编程方法,概念

    "蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也.蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也." ------------------------------------- ...

  7. Socket 编程实现基于 HTTP 协议的客户和服务

    目录 前言 研究背景及意义 研究内容及方法 研究要求与目标 相关知识点 HTTP协议 TCP协议 UDP协议 Socket编程技术 需求分析 Socket编程 Swing包 多线程的应用 功能设计 功 ...

  8. Socket编程--自己动手的HTTP代理服务器

    浏览器使用代理:Firefox浏览器: 选项->高级->连接->设置,选择手动配置代理. 实现http代理: 1.等待来自一个客户端的连接: 2.启动一个新线程来处理连接: Inpu ...

  9. C++socket编程(六):6.2 通过select实现超时处理

    完成了socket编程的阻塞与非阻塞,接下俩就要处理前面讲过的关于超时处理的内容了. select函数我们可以看下接口手册 如下代码: FD_ZERO(&set); //文件句柄置空FD_SE ...

最新文章

  1. 王建春计算机应用基础,计算机应用基础(本)教学指南.pdf
  2. python神经网络风格_[Deep-Learning-with-Python]使用LSTM生成尼采风格文章
  3. 在Ubuntu8.10下为PHP安装coreseek全文检索引擎支持的详细步骤
  4. 网络营销期间选用冷门关键词网络营销效果会好吗?
  5. 框架:Hibernate和Mybatis的区别
  6. boost::math::quadrature::tanh_sinh用法的测试程序
  7. IntelliJ IDEA 快捷键(一)(window版)
  8. Biorhythms(POJ-1006)
  9. 修复QQ在网页上的快速登录
  10. 杂记 - 进化成更好的人
  11. 纯js代码生成可搜索选择下拉列表
  12. 高级着色语言HLSL入门(6)
  13. PHP 框架集成使用 UEditor 编辑器的方法
  14. 怎么更改wifi频段_wifi信道和频段怎么设置?
  15. 32.768khz晶振应该接多大的电容
  16. java爬取中央气象台天气预报
  17. Java创建SpringBoot服务时yml文件显示粉色不显示绿色小叶子
  18. 大神超短代码实现超牛特效
  19. vue展示日历 考勤展示_vue实现日历组件
  20. IB课程必修课TOK到底有啥用?

热门文章

  1. 错误parsing XML: ubound prefix
  2. 使用腾讯SCF+onedrive搭建5T个人网盘
  3. JAVA(4)学习笔记:JVM虚拟机上的栈、大驼峰命名法和小驼峰命名法、实参和形参、重载方法、调用栈、递归练习(汉诺塔+斐波那契数列)、数组的定义、数组的初始化、增强for循环。
  4. Java中int、double、char等基础数据类型的取值范围
  5. 苹果5概念机_iPhone12Pro概念图:6.9寸超大屏+前后6镜头,价格略高
  6. react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)
  7. Flex自动换行调整上下边距
  8. Java获取二维数组行列长度
  9. 组合模式(部分整体模式)—结构型
  10. 剪板机结构设计(说明书+CAD图纸)