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

原创 2006年04月12日 18:45:00
昨天深夜醒来,一时难以入睡,从书架上找来买了许久的《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 Socket五种I/O模型

1)阻塞I/O(blocking I/O) 2)非阻塞I/O (nonblocking I/O) 3) I/O复用(select 和poll) (I/O multiplexing) 4)信号驱动...
  • taiyang1987912
  • taiyang1987912
  • 2015年02月11日 10:58
  • 5542

网络编程学习笔记一:Socket编程

“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打...
  • gneveek
  • gneveek
  • 2013年03月21日 01:11
  • 129134

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

昨天深夜醒来,一时难以入睡,从书架上找来买了许久的《Internetworking with TCP/IP Volumn 3》,翻看起来。虽然目前只看了前6章,但感觉的确对Socket理解不够。可以说...
  • Yasker
  • Yasker
  • 2006年04月12日 18:45
  • 4350

深入理解socket网络编程

1.1 客户端程式和服务端程式 网络程式和普通的程式有一个最大的差别是网络程式是由两个部分组成的--客户端和服务器端. 网络程式是先有服务器程式启动,等待客户端的程式运行并建立连接.一般的来说是...
  • wuqiuming2008
  • wuqiuming2008
  • 2011年09月14日 22:12
  • 2108

最近团队管理的反思

最近手头有个项目比较难
  • zl3450341
  • zl3450341
  • 2014年04月20日 23:29
  • 1580

POSIX定时器--timer_create等系列

直接上程序 程序1:采用新线程派驻的通知方式 [cpp] view plaincopy #include   #include   #include   #include   #incl...
  • yi412
  • yi412
  • 2015年07月03日 13:45
  • 1709

POSIX信号处理

POSIX信号处理信号(signal)就是告知某个进程发生了某个事件的通知,有时也称软件中断(software interrupt)。注意:信号是异步发生的,也就是说进程预先并不知道信号的准确发生时刻...
  • ASAP_Diablo
  • ASAP_Diablo
  • 2017年07月20日 16:11
  • 208

POSIX 线程详解

一种支持内存共享的简捷工具 Daniel Robbins (drobbins@gentoo.org), 总裁/CEO, Gentoo Technologies, Inc. ...
  • cuiyifang
  • cuiyifang
  • 2012年10月29日 09:30
  • 7802

《Programming with POSIX Threads》笔记

异步(Asynchronous):如果两个操作可以独立进行,称它们是异步的。 并发(Concurrency):看起来同时执行,但其实是顺序执行。如多个线程或进程在单个CPU上的行为。 并行(Paral...
  • ariesjzj
  • ariesjzj
  • 2015年02月26日 16:47
  • 1902

Programming With POSIX Threads 读书笔记(一)

我们现在编写一个简单的闹铃程序,允许用户输入一个时间,在这个时间过后闹钟显示到达时间的文本消息。 #include "errors.h" #include int main(int argc, ...
  • hyzhou33550336
  • hyzhou33550336
  • 2013年11月22日 20:37
  • 1152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux/POSIX Socket编程 笔记1及反思
举报原因:
原因补充:

(最多只允许输入30个字)