一、UDP套接字编程

1、点睛

  • 在UDP套接字程序中,客户不需要与服务器建立连接,可直接使用sendto()函数给服务器发送数据报。同样,服务器不需要接受来自客户的连接,可直接调用recvfrom()函数,等待来自某个客户的数据达到。

    2、图解

    套接字编程:生成网络应用 - 图2

    3、步骤

    (1)服务端

  • 1、创建套接字描述符(socket)。

  • 2、设置服务器的IP地址和端口号(需要转换为网络字节序的格式)。
  • 3、将套接字描述符绑定到服务器地址(bind)。
  • 4、从套接字描述符读取来自客户端的请求并取的客户端地址(recvfrom)。
  • 5、向套接字描述符写入应答并发送给客户端(sendto)。
  • 6、回到步骤4,等待读取下一个来自客户端的请求。

    (2)客户端

  • 1、创建套接字描述符(socket)。

  • 2、设置服务器的IP地址和端口号(需要转换为网络字节序的格式)。
  • 3、向套接字描述符写入请求并发送给服务器(sendto)。
  • 4、从套接字描述符读取来自服务器的应答(recvfrom)。
  • 5、关闭套接字描述符(close)。

    二、TCP套接字编程

    一、步骤

    1. 服务器端流程简介:**

  • (1)创建套接字(socket)

  • (2)将套接字绑定到一个本地地址和端口上(bind)
  • (3)将套接字设定为监听模式,准备接受客户端请求(listen)
  • (4)阻塞等待客户端请求到来。当请求到来后,接受连接请求,返回一个新的对应于此客户端连接的套接字sockClient(accept)
  • (5)用返回的套接字sockClient和客户端进行通信(send/recv);
  • (6)返回,等待另一个客户端请求(accept)
  • (7)关闭套接字(close)

    2、客户端流程简介

  • (1)创建套接字(socket)

  • (2)向服务器发出连接请求(connect)
  • (3)和服务器进行通信(send/recv)
  • (4)关闭套接字(close)

    套接字编程:生成网络应用 - 图3二、 send和recv函数的理解:

     当调用socket创建套接字时,同时在内核中生成发送和接收缓冲区。

  • 设置为connect模式时(客户端模式),调用send会将用户自定义的buff中的数据拷贝到发送缓冲区,缓冲区数据的发送由TCP/IP模型完成;

  • 设置为listen模式时(服务器端模式),发送缓冲区不再使用,接收缓冲区只存放客户端的连接请求。而accpet函数返回的新建套接字sockfd会再生成两个新缓冲区,发送和接收缓冲区。当调用recv时,recv先等待sockfd的发送缓冲区中数据按协议传送完毕,再检查sockfd的接收缓冲区,如果接收缓冲区没有数据或正在传送,则recv等待;否则recv将接收缓冲区中的数据拷贝到用户定义的buff中(ps:当接收缓冲区中数据长度大于buff长度时,recv要调用多次才能完全拷贝完成)。recv返回的是每次实际拷贝的数据长度,若拷贝出错则返回SOCKET_ERROR,若网络中断则返回0。
  • send和recv只是从发送/接收缓冲区中拷贝数据,真正的读写数据是由TCP/IP协议完成的