Loop本地回环
Loop本地回环,通常指的是以127开头的IP地址段(127.0.0.1 – 127.255.255.254),其中127.0.0.1是最常用的一个地址,被称为本地回环地址(Loop back address)。这个地址不属于任何一个有类别地址类,它代表设备的本地虚拟接口,因此默认被看作是永远不会宕掉的接口。在Windows操作系统中也有相似的定义,所以在不安装网卡前就可以ping通这个本地回环地址。
Loop本地回环的主要作用包括:
测试本机的网络配置:通过ping 127.0.0.1,可以检查本机的网卡和IP协议安装是否正常。如果能成功ping通,说明本机的网络配置基本没有问题。
应用程序的资源调用:在某些SERVER/CLIENT的应用程序运行时,需要调用服务器上的资源。当这些程序在同一台机器上运行而没有别的SERVER时,可以把SERVER的资源装在本机,SERVER的IP地址设为127.0.0.1,这样程序也可以正常运行。
粘包问题
粘包问题是TCP/IP通信中常见的一个问题,主要源于TCP的流式传输特性。具体来说,当发送方连续发送多个数据包时,由于TCP的缓冲机制,这些数据包可能会被合并成一个大的数据包发送给接收方,或者在接收方由于接收缓冲区的原因,多个数据包被合并在一起处理,这就是粘包现象。
粘包问题的原因主要有两个方面:
发送方原因:TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
接收方原因:接收方用户进程不及时接收数据,导致多个数据包在接收方的缓冲区中粘连在一起,当后续数据到达时,这些数据包被一起处理,从而产生粘包现象。
粘包问题的解决方法:
使用特定结束符:在每个数据包的末尾添加特定的结束符(如换行符\n),接收方在接收到数据时,根据结束符来区分数据包的边界。
固定数据大小:发送方和接收方约定每个数据包的大小,当发送的数据不足约定大小时,用空字符或其他填充字符补齐。
封装自定义数据协议:在TCP协议的基础上封装一层自定义数据协议,该协议中包括数据头和数据体两部分。数据头中存储了数据体的大小等信息,接收方在接收到数据后,先解析数据头,根据数据头中的信息来提取数据体。
recv函数和send函数的使用:通过合理的使用recv和send函数,可以有效地控制数据的接收和发送,从而避免粘包问题。
recv函数
recv函数的主要功能是从已连接的套接字接收数据。
c
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数:
sockfd:套接字描述符,用于标识要接收数据的套接字。
buf:指向缓冲区的指针,用于存储接收到的数据。
len:缓冲区长度,指定接收数据的最大字节数。
flags(可选):用于指定接收数据的额外选项。
返回值:
成功时,返回接收到的字节数。
如果连接被正常关闭,则返回0。
如果发生错误,则返回-1,并设置相应的errno。
注意事项:
recv函数是阻塞的,可以通过设置套接字为非阻塞模式或使用select/poll/epoll等机制来避免阻塞。
由于网络原因,recv可能无法一次性接收到全部数据,因此需要编写循环来接收数据。
接收到的数据可能需要重组或解析。
send函数
send函数用于实现数据的发送功能。
c
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
参数:
sockfd:套接字描述符,用于标识要发送数据的套接字。
buf:指向数据的指针,包含要发送的数据。
len:数据的长度,指定要发送的字节数。
flags(可选):用于指定发送数据的额外选项。
返回值:
成功时,返回发送的字节数。
如果发生错误,则返回-1,并设置相应的errno。
通过合理地使用recv和send函数,可以有效地进行网络通信,同时需要注意处理粘包等问题,以确保数据的正确传输和接收。