在网络编程中的核心就是套接字编程了,以下就给来介绍以下桃套接字编程的步骤,先来看一下所用到的背景知识:
- IP地址:用于表示一台进行网络服务的主机,现在有IPV4,IPV6,以下编程都基于IPV4
- 端口号:用来表示一台主机上进行网络服务的进程(uint16_t)
- 网络字节序:不同的主机有可能字节序不同,为了统一,进行网络通信时,都转为网络字节序(大端)
- 操作系统提供了一套接口供网络编程对网卡的操作,socket
socket编程分为TCP/UD两种,根据需求选择:
TCP优点:有连接、可靠传输、面向字节流、 缺点:传输效率低、数据粘包
UDP优点:传输效率快、不粘包 缺点:不可靠
而我们都知道进行网络服务需要客户端和服务端(c-s),下面先来看一下较为简单的UDP:
UDP:
服务端步骤:创建套接字-----绑定地址信息------收/发数据-----关闭套接字
- 创建套接字:失败返回-1,AF_INET代表用的是IPV4协议,SOCK_DGRAM是UDP格式
2.绑定地址信息:
bind是为套接字 sockfd 指定本地地址 my_addr,my_addr 的长度为 addrlen (字节)。而IPv4地址用sockaddr_in结构体表示,这个结构体中包含三部分信息:地址类型、端口号、IP地址。(对应上图)
- 地址类型: AF_INET是IPV4的地址类型
- 端口号:因为我们在linux中的main函数的参数传端口号和IP地址,接收的都是char类型的,所以用atoi转为int型,用htons转换为网络字节序代表端口,这个之前提过原因
- IP地址:inet_addr是将我们常用的点分十进制形式的IP地址转换为网络字节序地址
3.收/发数据
(1)接收数据recvfrom:用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buffer指向的内存空间,参数lenth为可接收数据的最大长度.参数flags一般设0,addres是client的地址信息,addres_len是address的长度(字节),成功返回消息的字节数,失败返回-1.
(2)发送数据sendto:message是要发送的消息,dest_addr是对端(client)的地址信息,失败返回-1
4.关闭套接字:close(socket)
客户端步骤:创建套接字-----绑定信息(不主动)-----收/发数据------关闭套接字
TCP:
服务端步骤:创建套接字----绑定----监听-----accept------收/发数据-----关闭
1.TCP中创建套接字和绑定,调用的接口是和UDP一样的,不过创建的时候第二个参数要是SOCK_STREAM,代表传输方式为数据面向字节流(TCP)
2.监听:listen()表明套接字处于监听状态,等待请求来时完成三次握手后进行后续动作,backlog参数是表示同一时刻可以接收最多的连接数,一般不会设置为太大。
3.accept:在完成三次握手后,用accept处理其之后的行为,若没有链接上来,默认阻塞等待,address一般设置为NULL,代表不关心客户端的地址
客户端步骤:创建套接字------connect----收/发数据------关闭套接字
1.connect:客户端用于连接到服务器上的接口,需要服务器的ip和端口号。