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连接总会等待至少到服务器的一次往返时间。

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

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

.

.

.

.

.

.

.

原文地址:https://www.cnblogs.com/yikuan-919/p/9998862.html