使用c/c++进行socket编程基础入门

一. 编程前必备的基础知识:

(1) 网络基础。你必须知道以下几点:

       ①熟悉TCP/IP协议四层模型,包括物理层、IP层、TCP/UDP层和应用层,熟悉滑动窗口等实现机制。

       ②我们一般所指的socket编程都是指TCP编程。由于UDP编程比较简单,而TCP的socket编程复杂得多,经常出现各种各样莫名其妙的问题,所以socket编程一般都是指TCP编程,下文如果没有特别说明,也都是指TCP编程。

       ③TCP与UDP的区别:TCP是面向连接的,除数据流的结尾无法从网络层预知是否全部接收到,中间是不会丢包的,不会丢掉任何一个字节;而UDP是无连接的,丢包是正常现象。

      ④ TCP是“全双工的字节流”,对这几个字必须要有透彻的理解,否则编程时就是一个马大哈,知其然不知其所以然。关于这几个字的理解,可以参考笔者的另外一篇博客文章“TCP的socket编程中全双工的字节流含义的深刻理解”(http://blog.csdn.net/waisock2017/article/details/78388380)。


(2) 编程前的基础知识

       ① socket编程的注意事项,参考笔者的另外一篇博客文章“TCP的socket编程中常见问题及注意事项”(http://blog.csdn.net/waisock2017/article/details/78448427)

       ② 阻塞与非阻塞。socket支持阻塞与非阻塞两种工作模式,通常网络上介绍的文章,都是使用默认的阻塞模式的。关于非阻塞模式的介绍,以及函数的各种返回值和各种细节,互联网上无论是国内或国外,资料几乎没有,需要自己测试。

       ③ 应用层协议采用二进制还是文本。他们各优缺点,通常,二进制长度更短,效率更高,但开发新手容易出错,比如大小端直接转换;文本简单,人可读,测试容易,但是传输的长度更长,字符串解析的效率不高。两者都能使用,由你根据自己的实际情况选择。

       ④ 局域网与广域网。只要网络是通畅的,局域网与广域网都可以进行TCP通信,一般没有多大区别,但是如果要改善用户体验,两者的区别就大了。比如你的程序一端在局域网一旦停止,那么对端的socket程序立马能感知到;但是如果在广域网,你一端的程序停止,如果细节处理不好,对端可能出现程序假死,不响应的情况,可能需要几秒甚至一分钟或几分钟以后才能响应,这些都需要长时间的实践才能编写出质量有保证的软件,对于新手,这些细节都是问题。

      ⑤ 记住要加包头、加心跳包等很多需要注意的问题。

      所以,对于2至3年的程序员,socket程序出现卡顿、假死、效率低、不同链接相互影响、程序死掉等各种莫名其妙的问题实在是太多了,如果要写出高质量的软件,没有高深的C/C++语言的功底,在加上3年至5年以上的socket编程实践,是不可能做得好的。


二.  socket编程流程。以下只列出基本的程序流程。





无论对于客户端或服务端,要提高socket性能,必须使用多线程方式,进行收发,否则无法做到socket通信的“全双工”,性能至少损失一半。尤其对于有用户UI界面进行操作的软件来说,必须将socket通信放到后台线程中,否则,一定导致界面假死、卡顿、用户操作不流畅等问题,尤其是在广域网环境,用户体验会极差,从而导致项目失败,这种失败的例子在笔者接触的公司及产品中不胜枚举。


三. 做好socket编程必备的前提条件

要想使用C/C++写好socket程序,必备的的前提条件如下:

(1) 极好的C/C++基础,包括指针,STL等基础知识。

(2) 多线程编程,必须精通。

(3) 各种线程锁或进程锁、事件、条件变量等线程同步机制,必须精通。

(4) 对socket编程至少有2至3年的实践经验及深刻的理论理解,尤其是对非阻塞socket需要自己探索,知道如何使用线程间的同步机制平衡CPU空循环、CPU阻塞等待、如何用好缓存等各方面的知识。


四. 结束语

       总之,编写一个基本的勉强能用socket程序其实并不难,一般程序员花一个月的时间都能写出来,但要想写出来的程序实现多条TCP连接、不出现各种异常、CPU该忙时就忙,该空闲时时就空闲、不出现各种卡顿、多条连接间不相互影响、持续稳定通信、性能高等质量要求高的程序并非易事,国内外90%的程序员根本做不到,只是很多程序员或公司管理层不自知,对此技术方面的难度没有一个明确的判断。比如,微软的MSN与腾讯的QQ就是一个很好的例子,当年的MSN采用TCP协议,而QQ采用UDP协议,最后效果上来说,采用TCP通信的MSN的通信效果和用户体验方面明显差,而采用相对简单的UDP通信的QQ的通信效果和用户体验好得多(腾讯在技术线路的选择上成功地避开了难度较高的TCP通信,也是体现了腾讯的成功绝不是偶然的),最终导致微软的MSN退出历史舞台,就连微软这样牛X的公司都上演这样的悲剧,更别说一般的公司,在TCP通信上更是难上加难。

      要做一个专业的socket程序的难度还是非常高的,必须有相当多的积累才可能编出质量过硬的软件。如果大家觉得难度过大,或者时间精力不足以从头开始编码,建议使用第三方的socket封装库来实现,专业的事情留给专业的人来做,站在巨人的肩膀上,质量更有保证,比起招聘几个程序员或团队研究2至3年还不一定能出成果相比,使用第三方socket封装库质量可靠得多。比如waisock就是一个非常优秀的socket封装库,该项目在知名公司的多个大型项目中使用过,经过了反复的锤炼,稳定可靠,性能卓越,官网是http://waisock.szxunxun.com/ ,大家不妨试试。







  • 14
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值