linux socket网络编程总结
概述
socket网络编程基本是程序员的基本技能了。具体是实现不再赘述。该篇总结,主要开发中遇到的一些细节实现和提高方式。
函数查询帮助
1.确定要实现的功能,在网上查到具体使用的函数
2.在linux终端使用"man 函数名"查询

socket编程实现步骤
1、socket是CS架构,编程前确定当前的角色:server或client或都支持。
2、基本架构完成后,能通讯拿到数据
3、如果使用UDP传送,可能需要拆包组包,网络主机字节序转码
4、业务功能实现
UDP传输注意:
- 客户端若只是接收数据,也需要先向服务端发送一个数据,服务端拿到客户端ip,服务端根据ip给客户端发送数据。若是广播形式或许不需要(未深入了解)。
- 若使用bind绑定了ip地址,通讯可以直接使用write、read代替sendto、recvfrom。
拆包组包
UDP不考虑驱动自动对超过MTU个字节自动拆包的支持,最大可以传输65507字节,接近64KB。
拆包
每次传输的包超过64KB,由于UDP传输的不确定性和非有序性,需要自己实现对数据包传输的序列定义,让数据接收端根据序列组成完整数据。
MTU

对于超过一个MTU的数据包,IP协议会对包分片,接收端IP层会自动组包。如果IP组包时,未能按照收到某一个分片,就会丢掉接受的包。因此对于应用层,就会出现丢包现象。
组包
根据拆包在有效数据前加的包头,按照包头中的信息,组合为完整的数据。
注意: 面向连接方式,如TCP,不需要做拆包和组包操作,有多少数据发多少数据,数据被有序接受到,这也是TCP传输效率低的一方面因素。实际上UDP的拆包组包被TCP实现。
主机、网络数据传输字节序转换
不同的主机上支持的数据存储方式不同:大端存储或者小端存储。为保证数据被传输后,在主机上被正确识别,因此网络传输固定使用大端存储。
发送端
发送数据时,高于一个字节的数据类型需要转为网络字节序,即大端存储格式。
- htons 把unsigned short类型从主机序转换到网络序
- htonl 把unsigned long类型从主机序转换到网络序
接收端
- ntohs 把unsigned short类型从网络序转换到主机序
- ntohl 把unsigned long类型从网络序转换到主机序
例如:
// 发送端
int a = 10;
char buf[10];
memcpy(char, htonl(a), sizeof(a));
// send data
...
// 接收端
int a;
char buf[10];
// recieve data
...
memcpy(&a, buf, sizeof(a));
a = ntohl(a);
高级网络编程-socket的选项设置(提高)
针对对socket不不同需求和实现场景,有一些option可以被设置,更方便好高效的使用socket。使用函数

具体选项在《计算机网络编程》、《Unix网络编程》、《linux高级程序设计》中查阅,或者搜索“高级网络编程”了解。
可参考如下:



void *optval
获得或者是设置套接字选项值,根据选项名称的数据类型进行转换。对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。
套接字的选项粗分为两大基本类型:
Ø 一是启用或禁止某个特性的二元选项(称为标志选项)。
Ø 二是取得并返回我们可以设置或检查的特定值的选项(称为值选项)。
上图中标有"标志"的列指出一个选项是否为标志选项。当给这些标志选项调用getsokopt函数时,optval是一个整数,optval中返回的值为0表示相应选项被禁止,不为0表示选项被启用。类似地,setsockopt函数需要一个不为0的optval值来启用选项,一个为0的optval值来禁止选项。如果上图中“标志”列不含有“·”,那么相应选项用于在用户进程和系统之间传递所指定数据类型的值。
例如:设置禁用Nagle算法
sockfd = socket(AF_INET, SOCK_STREAM, 0);
flag = 1;
int ret = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag));
if (ret == -1) {
printf("Couldn't setsockopt(TCP_NODELAY)\n");
}
socklen_t *optlen / socklen_t optlen
含义是缓冲区大小,setsockopt函数指定*optval中值存储大小(传值),getsockopt返回查询的属性值的长度(穿指针)。对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。
好的博客
| linux网络程序设计——3 socket属性设置 | https://blog.csdn.net/q8250356/article/details/81058341 |
| UDP包的最大大小是多少? | https://blog.csdn.net/caianye/article/details/38227773 |
| TCP、UDP数据包大小的限制 | https://blog.csdn.net/caoshangpa/article/details/51530685 |
本文深入探讨Linux Socket网络编程的细节与高级技巧,包括函数查询、实现步骤、数据拆包组包、字节序转换及高级选项设置。适用于希望提升Socket编程技能的开发者。

8786

被折叠的 条评论
为什么被折叠?



