1、网络通信编程
  • 1)网络通信模型基础知识

    • TCP

    Server:

  1. WSAStartup()
  2. socket()
  3. bind()
  4. linsten()
  5. accept()
  6. send/recv()
  7. closesocket()
  8. WSACleanup()

Client:

  1. WSAStartup()
  2. socket()
  3. connect()
  4. recv/send()
  5. closesocket()
  6. WSACleanup()
    • UDP

    客户端A

  1. socket()
  2. bind()
  3. send()
  4. recv()
  5. close()

客户端B

  1. bind()
  2. recv()
  3. send()
  4. close()
  • 2)网络模型

    • WSAAsyncSelect模型

    创建窗口(CreateWindows)/对话框然后为该窗口提供一个窗口回调函数(WinProc)/对话框函数。

    通过调用WSAsyncSelect函数自动将套接字设置为非阻塞模式,并注册一个或多个感兴趣的网络事件。

    • WSAEventSelect模型

    WSAEventSelect模型是以事件的形式通知应用程序。

    1)创建事件对象,注册网络事件 WSACreateSelect()/WSAEventSelect()

    2)等待网络事件发生 WSAwaitForMultpleEvents()

    3)获取网络事件 WSAWaitForMultipleEvents()

    4)手动设置信号量和释放资源 WSAResetEvent()

    • 完成端口模型

    利用内核对象的调度,使用少量的几个线程来处理和客户端的所有通信,从而消除线程上下文切换问题。当有事件产生时CPU能保证有资源可用,然后将这些事件加入到一个公共消息队列中去,当前哪一个线程空闲就去处理公共消息队列里的事件,如果没有事件了,线程就空闲下来。

    1)初始化套接字组件 WSASocket()

    2)绑定和监听 bind()

    3)创建完成端口 CreateIoCompletionPort()

    4)创建服务线程 GetSystemInfo()

    5)连接客户端 accept()

    6)套接字与完成端口关联 CreateIoCompletionPort()

    7)将套接字与完成端口关联起来以后,应用程序调用发送数据/接收数据函数完成重叠IO操作

  1. WSASend()/WSASendTo()
  2. WSARecv()/WSARecvFrom()

8)等待重叠I/O操作结果 GetQueuedCompletionStatus()

9)投递完成通知 PostQueuedCompletionStatus()

2、多线程
  • 原子

    某一个线程对于某一个资源做操作的时候能够保证没有其他的线程能够对此资源进行访问。

  1. Interlockedxxxxx
  • 缺点:只能解决某个变量的问题,只能使一个整型数据做简单算数运算的时候是原子的。

  • 临界区

    临界区是使用EnterCriticalSection与LeaveCriticalSection形成一个保护区来保护代码,这一对函数保证,多个保护区的代码,同一时刻只能有一个保护区的代码在执行。

  1. EnterCriticalSection()
  2. LeaveCriticalSection()
  • 缺点:临界区是在一个进程内有效的,无法在多线程的环境下进行同步。

  • 互斥体

    一个线程进入临界区,结果因为线程由于某些原因崩溃了临界区无法被释放,那么其他线程也无法进入临界区,全部被卡住。互斥体可以解决这些问题。

    1、互斥体有两个状态,激发态和非激发态

    2、有一个概念,叫做线程拥有权与临界区类似。

    3、等待函数等待互斥体的副作用,将互斥体的拥有者设置为本线程,将互斥体的状态设置为非激发态。

  1. CreateMutex()
  2. OpenMutex()
  3. WaitForSingleObject()
  • 信号量

    信号量是一种同步机制,对于一个信号量来说,它可以被加上多把锁,当所有的锁孔都被锁上,才不允许其他线程访问被信号量锁住的区域。

  1. CreateSemaphore()
  2. OpenSemaphore()
  3. ReleaseSemaphore()
  4. CloseHandle()
  • 事件

    可以设置等待函数对于此事件对象有没有副作用,也可以手动设置事件对象为激发态还是非激发态

  1. CreateEvent()
  2. OpenEvent()
  3. SetEvent()
  4. ResetEvent()
  5. PulseEvent()
  6. CloseHandle()
  • 小结:
  1. 原子操作:简单的同步机制,只能对4个字节的数据进行算数运算
  2. 临界区:对一段代码实现保护操作,只能在一个进程中的不同线程使用。无法检测由于线程崩溃造成的临界区无法释放的问题。
  3. 互斥体:是一个内核对象,可以在不同进程的线程中实现对于一段代码的保护。能够检测由于线程崩溃造成的互斥体释放问题。只能被拥有者线程释放,故而多线程间的不同回调函数的同步使用互斥体可能会造成问题。
  4. 信号量:是一个内核对象,没有拥有者的概念,可以控制多个线程同时访问被保护的代码,并且给线程数量设置一个上限。
  5. 事件:是一个内核对象,没有拥有者的概念,可以封装自己的同步机制。

【API】网络编程模型、多线程的更多相关文章

  1. Linux IO模型和网络编程模型

    术语概念描述: IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者. 阻塞和非阻塞,是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待. 以文件IO为例,一个IO读过程是文件 ...

  2. Java网络编程和NIO详解3:IO模型与Java网络编程模型

    Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...

  3. c/c++ 网络编程与多线程 编译参数

    网络编程与多线程 编译参数 编译时要链接操作系统的pthread库 g++ -g socket01.cpp -std=c++11 -pthread 不加-pthread的话,出现下面的错误: term ...

  4. linux网络编程模型

    1.编程模型 Linux网络编程模型是基于socket的编程模型

  5. TCP/IP网络编程之多线程服务端的实现(二)

    线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...

  6. 网络编程之多线程——GIL全局解释器锁

    网络编程之多线程--GIL全局解释器锁 一.引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that preven ...

  7. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  8. Java API —— 网络编程

    1.网络编程概述     1)网络编程概述     · 计算机网络         是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通 ...

  9. [国嵌攻略][090][linux网络编程模型]

    编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型

  10. 谈谈传统BIO网络编程模型的局限性与NIO

    先来看看我们的server端: 创建一个serversocket,进行监听,每来一个客户端,就启动一个新启动为其服务: private void createListenSocket() { //如果 ...

随机推荐

  1. 《Linux内核分析》第三周学习笔记

    <Linux内核分析>第三周学习笔记 构造一个简单的Linux系统MenuOS 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.stud ...

  2. 第二阶段冲刺——five

    个人任务: 王金萱:合并程序(统计团队博客). 季方:合并并排除运行团队博客时出现的错误. 马佳慧:优化登录.注册信息的填写判断. 司宇航:完成打印名单的功能. 站立会议: 任务看板和燃尽图:

  3. 小组成员的github地址

    袁颖https://github.com/joanyy/test 魏晓 https://github.com/weixiaohaobaobao/test 张晓磊 https://github.com/ ...

  4. 小学四则运算APP 第一阶段冲刺 第二天-补

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布已经解决上次问题,问题是写程序逻辑错误,问题已经修改!我们还增加两个模块的面板设置,如 ...

  5. Daily Scrum - 11/23

    今天更新blog时发现了老师对我们daily scrum提的要求,从明天起除了简要记录组会的主要内容之外,还会总结上一个工作日每个组员的工作进度.代码提交情况和燃尽图. 今天会议内容主要是人千.章玮同 ...

  6. 使用VS2013进行C#程序的单元测试

    没有按照预期的那样做出成功的单元测试,磕磕绊绊参照了下面两篇博客大致做出来了,所以很有必要记录一下过程. http://www.cnblogs.com/duasonir/p/5299732.html( ...

  7. DEP

    DEP(Data execution protect)数据执行保护,这个功能需要操作系统和硬件的共同支持才可以生效.DEP的原理就是在系统的内存页中设置了一个标志位,标示这个内存页的属性(可执行). ...

  8. 外媒速递:系统管理员必须掌握的20条Linux命令

    [51CTO.com原创稿件]外媒速递是核子可乐精选的近日国外媒体的精彩文章推荐,希望大家喜欢! 今天推荐的内容包括:系统管理员必须掌握的20条Linux命令.五款最佳Linux屏幕记录应用.MySQ ...

  9. 【移动端debug-6】如何做一个App里的web调试小工具

    原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...

  10. NOI&&NOIP知识点集萃

    更新日志 \(update:2019-3-4\) 更新了自为风月马前卒的后缀数组(省选不到一个月了,我才开始学后缀数组怕是要凉凉) \(update:2019-2-21\) 更新了一篇李超线段树的讲解 ...