- 论坛徽章:
- 0
|
周六被猎头推荐去阿里巴巴面试。复试的时候,谈到了我写的一个跨平台网络库。当时面试官问我,有没有对字节序的处理?我说没有,但可以提供这个功能。不过我认为这个应该是用户的自定义协议去处理的问题。当时面试官乐了,说,作为一个用户,难道我还要去自己处理字节序转换的问题么?难道你的库就不能自动处理么?我当时没再接话。我想,我库是可以统一转换为一种统一的字节序,然后再进行传输,相关部分对用户透明。但是万一双方的机器字节序是相同的,且刚好和库设定的统一字节序相反,那岂不白白浪费系统资源,降低性能?
如果要智能,那有两种方式。
1. 我的库之间加入一个协议,进行一次封包。该协议在TCP/UDP与用户协议之间。封包有一个字节表示:32位大端、32位小端、64位大端、64位小端。然后再在该类型字节后面加入一个32比特字段,指示封包长度,或序号信息(针对UDP协议)。用户私有协议全建立在库的协议之上。
但这有两个问题:
a. 如果通讯器中一方不使用我的库开发的呢?那这协议应该立刻无效,否则就是我给库的用户强加了一个要求:通讯双方均要用我的库开发。但如果协议无效了,那么,是不是该用户自己编程也好,调我的功能函数也好,自己过来处理这个问题呢?
b. 多了这么一层封包解包,而封包其实就带一个信息:包的字节序。为了带上这个信息,结果我需要多带另外两个信息:包的序号和包长。为了1块钱的收益,花了2块钱。如果传输频率很高,累积下来将白白耗费不少不必要的机器资源。
2. 用户自己过来处理这件事。在用户自定义协议中加入字节序的识别。只要收方看到字节序和本机相同,且机器字长相同,就不作处理;只有以上两者有不同时,才调用库的功能函数处理,或自己处理(系统就有这样的函数,简单封装一下就行,一点也不难)。
我想,大部分的公司,就服务器段而言,设备都是批量买的,一般都是统一架构的CPU;而且就客户端而言,小端存储(IA-32/64架构,比如Intel的Core 2),占了市场很大一部分。数据包包体内容不同字节序之间的转换其实发生频率相对很低。如果要偷懒让100%的网络操作为一个相对的小概率事件买单(任何一次网络接收或者发送,进行不一定需要的网络字节序转换,或者多一层封包),那是很错误的行为。
不知道大家的看法是怎样的呢? |
|