• Socket通信


    服务器:

      1.创建一个socket

      2.bind一个句柄(端口和地址)

      3.listen设置监听的客户数

      4.accept客户端的句柄

      5.读写。

    客户机:

      1.创建一个socket

      2.connect到服务器

      3.读写操作。

    Socket通信又会涉及到阻塞和非阻塞的方式;

      当Windows套接字在阻塞和非阻塞两种模式下执行I/O操作:

      阻塞模式下:

        在I/O操作完成前,执行的操作函数一直等候而不会立即返回,该函数所在的线程会阻塞在这里。

      非阻塞:

        套接字函数会立即返回,而不管I/O是否完成,该函数所在的线程会继续运行。

      在阻塞模式的套接字上,调用任何一个Windows Sockets API都会耗费不确定的等待时间:

        Windows套接字程序使用“生产者-消费者”模式来解决:

          在程序中,“生产者”读入数据,“消费者”根据需求对读入数据进行处理;

          通常“生产 者”和“消费者”存在于两个线程中,

          当“生产者”完成读入数据时,使用线程同步机制,例如设置一个事件通知“消费者”,“消费者”接收到这个事件后对读入 的数据进行处理。

        当使用socket()函数和WSASocket()函数创建套接字时,默认的套接字都是阻塞的。这意味着当调用Windows Sockets API不能立即完成时,线程处于等待状态,直到操作完成。

    并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()函数时,函数会立即返回。将可能阻塞套接字的Windows Sockets API调用分为以下四种:

    1.输入操作

      recv()、recvfrom()、WSARecv()和WSARecvfrom()函数。以阻塞套接字为参数调用该函数接收数据。如果此时套接字缓冲区内没有数据可读,则调用线程在数据到来前一直睡眠。

    2.输出操作

      send()、sendto()、WSASend()和WSASendto()函数。以阻塞套接字为参数调用该函数发送数据。如果套接字缓冲区没有可用空间,线程会一直睡眠,直到有空间。

    3.接受连接

      accept()和WSAAcept()函数。以阻塞套接字为参数调用该函数,等待接受对方的连接请求。如果此时没有连接请求,线程就会进入睡眠状态。

    4.外出连接

      connect()和WSAConnect()函数。对于TCP连接,客户端以阻塞套接字为参数,调用该函数向服务器发起连接。该函数在收到服务器的应答前,不会返回。这意味着TCP连接总会等待至少到服务器的一次往返时间。

      使用阻塞模式的套接字,开发网络程序比较简单,容易实现。当希望能够立即发送和接收数据,且处理的套接字数量比较少的情况下,使用阻塞模式来开发网络程序比较合适。

    阻塞模式套接字的不足表现为,在大量建立好的套接字线程之间进行通信时比较困难。当使用“生产者-消费者”模型开发网络程序时,为每个套接字都分别 分配一个读线程、一个处理数据线程和一个用于同步的事件,那么这样无疑加大系统的开销。其最大的缺点是当希望同时处理大量套接字时,将无从下手,其扩展性 很差。

    .

    .

    .

    .

    .

    .

    .

  • 相关阅读:
    MongoDB repair on Ubuntu
    java后台图形相关代码,weblogic报错
    weblogic配置达梦数据源
    详解JavaScript中的this
    web app指南之构建html5离线应用
    android中的跨进程通信的实现(一)——远程调用过程和aidl
    android应用开发全程实录出版
    android窗口管理框架解析
    BizTalk调用SAP系统RFC含多个参数以及DateTime类型参数
    plsql连接64位oracle在windows 764下连接设置方法
  • 原文地址:https://www.cnblogs.com/yikuan-919/p/9998862.html
Copyright © 2020-2023  润新知