linux socket网络编程总结

概述

socket网络编程基本是程序员的基本技能了。具体是实现不再赘述。该篇总结,主要开发中遇到的一些细节实现和提高方式。

函数查询帮助

1.确定要实现的功能,在网上查到具体使用的函数
2.在linux终端使用"man 函数名"查询
在这里插入图片描述

socket编程实现步骤

1、socket是CS架构,编程前确定当前的角色:server或client或都支持。
2、基本架构完成后,能通讯拿到数据
3、如果使用UDP传送,可能需要拆包组包,网络主机字节序转码
4、业务功能实现

UDP传输注意:

  1. 客户端若只是接收数据,也需要先向服务端发送一个数据,服务端拿到客户端ip,服务端根据ip给客户端发送数据。若是广播形式或许不需要(未深入了解)。
  2. 若使用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值