在C#中,通讯编程是十分容易的一件事情.以前在C++中很长的代码能完成的事情,在C#中几句代码就能解决,这得益于.net框架提供的高度封装的类库.学习C#3年了,觉得应该把自己的心得写出来,供别人也供自己以后学习.
注:以下内容纯粹属于随笔,没有目录.可能内容中有些错误,欢迎指正.
另:这里所说的通讯编程指Windows系统下的通讯编程.
一.网络通讯
网络通讯最主要的方法就是Socket通讯,所以我也只学习了Socket TCP/UDP通讯,至于什么命名管道啊什么的通讯我没有去学习,不是不值得学,而是因为自己精力有限,把所有的精力都放到了Socket TCP/UDP通讯上.
二.通讯协议
1.TCP
TCP通讯协议是基于IP协议之上的一种面向可靠连接的通讯协议,在它之上有类似很多的比如http,ftp等协议都是我们熟悉的.它的优点是传输可靠,能够保证数据完整的正确的发送到接收方,在对数据正确性和完整性比较高的场合,TCP通讯是我的选择.
TCP协议的通讯过程:首先,必须先建立和接收方的通讯链接(Connect),接收方响应链接(Accept);然后才是发送数据(Send),接收方接收数据(Receive);最后双方拆除链接(Disconnect).
上面的通讯过程是我们具体使用TCP协议进行编程时的操作,实际上对于底层通讯,在链接建立和数据通讯的过程中,通讯双方的Socket实际要做很多事情,当然,这些不是我们关心的,我们也无须控制它,除非我们熟知通讯双方的网络状况,我们才可以调整Socket在通讯过程中的一些配置参数(SetSocketOptions),参数非常之多,我也没具体了解过,不过可以参考<TCP/IP协议详解>和<Windows网络编程>等书.
使用TCP/IP协议编程务必了解NG算法.NG算法是一种排队算法,通俗的讲,因为TCP/IP的传输效率问题(TCP协议的数据头比UDP协议的数据头要大),它采用一种算法,使网络上一次数据交互能够最大可能的传输数据,也就是在一定时间内,调用Send方法发送数据的时候,TCP并非立即发送,而是等待缓冲区到一定水位后再进行发送,除非等待的时间到达,否则TCP会一直等待缓冲区内有更多的数据.
NG算法能解决TCP/IP通讯效率的问题,但是也给我们编程带来了一定的难度,其中最大的麻烦就是包粘连问题.也就发送方发送数据是一个包一个包进行发送的,但是接收方可能一次性就能从接收缓冲区内读出1~n个数据包.因此接收方务必处理好这个问题. 不过据我经验而言,接收时一般接收到的数据包的个数均为整数,没发现过一个数据包只接收一半的情况,除非发送方一个包的数据长度超出了接收缓冲区的大小.
下一节:UDP协议概述
评论