yasker的技术blog

内敛,以致外现

Linux/POSIX Socket编程 笔记1及反思
昨天深夜醒来,一时难以入睡,从书架上找来买了许久的《Internetworking with TCP/IP Volumn 3》,翻看起来。虽然目前只看了前6章,但感觉的确对Socket理解不够。可以说,根本连点皮毛都不懂就开始写程序,难怪莫名奇妙的问题一堆一堆……这回得要深刻检讨自己了……
上次趋势比赛,我用极短的时间写出了能够使用的Socket通讯部分(客户端与服务器),但是最终碰到了一个莫名的错误,虽然证实有一部分是dotnet本身的问题,但是仍然是由于我负责的部分没能够避免那个问题的存在。当时的具体环境也就是个封闭的内网。比较系统的看了Socket的编程方法以后,写出一些总结如下:
1、关于选择Socket的传输协议
当时不应该选择TCP,而应该选择UDP。
当时几乎是下意识的认为,UDP不可靠,不应该选择。但是实际看起来,在内网(LAN)的范围内,UDP实际上是足够可靠的,而且设计要求也允许一定量的丢包(实际上,UDP的丢包率相比截获时的丢包率要小不少,完全可以忽略不计)。而UDP以datagram为单位的,处理上要好办得多。我当时用TCP时,还得要在前面加上数据包长度,还得要自己创建可变长度的buffer来填数据,不是比UDP麻烦一点……
UDP不是洪水猛兽……
2、关于有时候无法关闭连接
TCP关闭连接,还是件比较麻烦的事情。由于面向流传递,无法通过数据本身判断,不像UDP可以直接用connectless方式不用管Server的状况。看着MSDN例程上的shutdown函数,有些不懂,今天算是搞懂了:为了给Server发送一个消息,表明Client已经发送完毕,让服务器关闭连接(是由服务器受到end-of-file信号以后关闭连接的)。我似乎是做过单方面让Client关闭连接,难怪服务器没有对连接关闭没有反应了……
3、关于Client的端口号
当时做测试的时候就奇怪,为什么Server建立连接后得到的Client的端口号那么奇怪……现在才明白,其实Client的端口号是自己生成的,找的自己机器上没有用到的、且不属于特定服务指定端口的端口号,所以才会出现1000+的端口号。我一直愚蠢的以为,Server和Client端口号要一致……实际上,只有Server的监听端口是固定的,对Client没有要求。
4、关于多IP的Client问题
当初的项目,由于Client运行在网关上,所以有多个IP。我们一直没能很好解决如何确定是哪个IP在对外通信(与Server通信)哪个IP是对内的。最后解决方法是让Server在建立连接后给Client传递Server看到的IP。实际上,完全是多此一举……
在看到"6.13 A Fundamental Problem In Choosing A Local IP Address"一节时,我几乎疯掉了……实际上,Berkeley Socket已经考虑到了这个问题,最初连接的时候,可以把本地IP地址留空(实际上,我们似乎没考虑本地IP在传输中的作用),然后在建立连接后由TCP/IP去选择本地IP,自动填入结构。也就是说,直接一个函数就可以取回来的东西,我们却用了相对而言那么复杂的一个机制……
暂时看到了这么多。其实就算仅仅看到第六章,感觉自己也就是个白痴了……
阅读更多
个人分类: 网络
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Linux/POSIX Socket编程 笔记1及反思

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭