目录
1.认识socket编程
网络通信的本质
介绍socket编程之间,我们先来看看网络通信的本质。
网络通信的本质是什么呢?我们需要明确一点,网络通信需要IP地址和端口号。IP地址在标识网络中唯一的一台主机,端口号标识主机中唯一的一个进程,IP地址加端口号就能标识网络中唯一的一台主机上唯一的一个进程。也就是说,通过IP地址和端口号,就可以找到整个网络中唯一的一个进程。所以网络通信的本质就是进程间通信。
更何况,用户在使用设备进行通信的时候,使用的是设备上的应用服务,应用服务本身就是启动的进程。
什么是socket编程?
网络通信的本质是进程间通信,是一种需要依靠IP地址和端口号的进程间通信,我们把这种基于IP地址和端口号的进程间通信叫做socket通信。socket的中文意思是插座,socket通信的模式类似于插板插座这样的模式,通信双方都必须要知道对方的IP地址和端口号就相当于把插板和插线接通,这样才能进行通信。而基于这种模式进行网络通信的编程就是socket编程。(Socket,通常也称为“套接字”)
如何进行socket编程?
进行网络编程需要依靠网络层的网络传输协议,而网络传输协议是在操作系统内部实现的,用户不能直接访问操作系统内部的代码数据,这个时候,操作系统就要提供系统调用接口供用户使用,从而进行网络编程。这些接口就是socket编程的接口。
2.基于UDP的socket编程
当我们进行网络编程时,往往是基于CS模式(客户端服务器端模式),所以需要编写客户端程序和服务器端程序。
进行socket编程时往往需要包含这些头文件:
服务器端程序编写步骤
1.创建socket
示例代码:
socket函数介绍:
2.将本地信息和网络信息进行绑定
示例代码:
bind函数介绍:
在绑定信息前,需要填充struct sockaddr_in结构,作为参数传递时,需要强转为struct sockaddr 类型。
3.接收数据
服务器端程序需要先收数据,再发消息进行响应。
示例代码:
recvfrom函数介绍:
4.发送数据
示例代码:
sendto函数介绍:
客户端程序编写步骤
1.创建socket
这一步和服务器端的一样。客户端创建好socket之后,直接就可以进行数据的收和发了。
2.发送数据
当客户端创建socket套接字之后,直接就可以进行数据的收发了;需要明确的是,客户端需要先发送数据,然后接收数据。
示例代码:
这一步和服务器端也是一样的,参考服务器端即可。
3.接受数据
示例代码:
使用同服务器端。
3.基于TCP的socket编程
服务器端程序编写步骤
1.创建流式套接字
示例代码:
创建流式套接字使用的接口还是socket(),只不过第二个参数需要写成 SOCK_STREAM,这是因为TCP是面向字节流的协议,SOCK_STREAM表明创建流式套接字。
2.绑定本地信息和网络信息
示例代码:
使用上和服务器端的bind完全相同。
3.将流式套接字设置为监听状态
TCP是有连接的协议,客户端和服务器端需要建立连接才能进行通信,将流式套接字设置为监听状态的目的是用于监听连接的状态。
示例代码:
listen函数介绍:
4.获取连接
listen函数将socket返回的套接字设置为监听套接字之后,监听套接字就会监听连接建立的状态,当有连接建立时,accept函数就会从监听套接字中获取连接,并返回一个新的文件描述符,用于建立该连接的客户端和服务器之间的通信。
服务器只有一个,但是客户端可以有很多,多个客户端和一个服务器之间要进行通信,就要求服务器中需要为每个连接建立用于通信套接字。
示例代码:
accept函数介绍:
5.接收消息
因为TCP是面向字节流的协议,所以我们可以使用文件读写接口 read 和 write。
示例代码:
read函数介绍:
6.发送消息
代码示例:
write函数介绍:
客户端程序编写步骤
1.创建套接字
客户端中创建套接字使用的还是socket函数,需要注意的是,第二个参数设置为SOCK_STREAM,表明是基于TCP协议进行的通信。
2.发起连接
TCP是有连接的协议,客户端想要和服务器端进行通信时,首先要发起建立连接的请求,服务器端的监听套接字监听到请求建立连接成功之后,accept函数就会从监听套接字中获取连接,并分配一个文件描述符,该文件描述符所关联的文件用于建立连接的双方进行通信。这也就解释了客户端的为什么要设置监听套接字和获取连接的行为。
示例代码:
connect函数介绍:
3.发送消息
实例代码:
send函数介绍:
4.接收消息
示例代码:
recv函数介绍: