socket编程
记住关键字:文件打开、工厂模式、TCP/IP层、服务器端与客户端、先设置socket、再使用socket。
首先socket是什么呢?其实就像windows中的窗口,编程的时候其实用到的只是个句柄,同样socket函数返回一个int。就像打开文件一样返回一个文件句柄(int)另外打开文件、创建socket使用到了工厂模式即传入不同的参数就创建不一样的socket。
然后还要关注TCP/IP层的问题,socket只是TCP层的东东,而他还要依赖于IP层,所以这就需要用到bind函数去绑定IP地址、端口号,这就是服务器端。而客户端就不需要bind,而是直接调用connect函数通过系统自动分配端口号,另外需要注意,connect的参数需要指定的是服务器段的IP地址、端口号。接下来就要换一个角度来说了,前面都是横向、纵向设置socket的,下面就是使用socket了,即服务器端listen上面设定好的socket,然后就是accept,注意accept函数有一个传入参数用来存取接收到的客户端的IP地址、端口号,如果对客户端的IP地址不感兴趣可以用NULL作为实参。在这里还要纠正一句话“监听某个端口”,其更准确的说法应该是,把某个socket绑定到某个端口上,然后去监听这个socket,其最终的结果就是监听了某个端口(相当于a-》b-》c结果是a-》c)。然后就是服务端、客户端的用已经连接好的socket来read和write了。
最后不要忘了close。
除了上面说道的主要之处还需要注意的有,大小端字节流、字符串到IP地址的转换等小技巧
再来说一下应用层的协议比如rtp协议(流媒体协议)
这里首先要说的是会话的概念,由于TCP是面向连接的(源到目的),所以送socket来表示着个TCP连接,而在rtp协议中,也是存在连接这个概念的,那么用什么表示这个连接的概念呢?这就是会话RTPSession(jrtplib中会话类),所以说到流媒体或者jrtplib来编程时就应该不要对RTPSession怀疑了。另外IP层是没有连接这个概念的,所以IP层就不存在会话。
另一方面socket、会话自然而然的就有了面向对象的思想,这里说面向对象的思想是想说,很多开源库都多少有面向对象的思想,如PortAudio中的输入流、输出流还有speex中的SpeexBits(其实是存储压缩过后的音频的数据)等等