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)信号驱动...

网络编程POSIX规范要求数据类型

数据类型 说明 来源 int8_t 带符号8位整数 uint8_t 无符号8位整数 int16_t 带符号16位整数 uint16_t 无符号16位整数 int32_t 带...

常见的网络编程面试题

1:tcp和udp的区别 TCP:是面向连接的流传输控制协议,具有高可靠性,确保传输数据的正确性,有验证重发机制,因此不会出现丢失或乱序。 UDP:是无连接的数据报服务,不对数据报进行检查与修改,...

Golang在Linux环境下的POSIX风格socket编程

这里给出一个服务端和客户端,服务端可以接收多个连接,并且利用Go的杀手特性go和channel来替代select进行数据的接受。 服务端: package main import ( "fmt...

MDI窗体的工具栏合并(ToolStrip Merging)的功能实现

这个模型的大概构成是这样的:1个MDI主窗体,1~n个MDI子窗体;主窗体上一般会有1个主菜单栏,1~n个主工具栏;子窗体设计时上可能有0~1个主菜单栏,0~1个主工具栏,运行时子窗体的菜单栏和工具栏...
  • asciil
  • asciil
  • 2008年07月18日 15:04
  • 1117

MailBee.NET Objects接收电子邮件(POP3)教程一:接收简单的电子邮件

MailBee.NET Objects是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。几行代码便可为应用程序添加E-Mail支持,简单高效。具备“必需”以及独特的功能,这...

Posix多线程编程学习笔记(六)—共享内存(1)

一、什么是共享内存区 共享内存区是最快的可用IPC形式。它允许多个不相关的进程去访问同一部分逻辑内存。如果需要在两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案。一旦这样的内存区映射...
  • elbort
  • elbort
  • 2012年05月22日 11:31
  • 323

Posix多线程编程学习笔记(三)—信号灯(1)

Posix有名信号灯        函数sem_open创建一个新的有名信号灯或打开一个已存在的有名信号灯。有名信号灯总是既可用于线程间的同步,又可以用于进程间的同步。   1.posix有名信...
  • elbort
  • elbort
  • 2012年05月22日 10:35
  • 232

Posix多线程编程学习笔记(一)—线程基础(1)

一.什么是线程       在一个程序里的多个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的一个控制序列”。        典型的unix进程可以看成只有一个控制线程:一个进程在同...

pthread学习笔记(三)--跋涉之旅之Posix线程编程指南(1)

之前对pthread_attr_t这个属性对象的了解非常浅薄,从网上找了一些解释比较好的资料,链接  __detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pth...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux/POSIX Socket编程 笔记1及反思
举报原因:
原因补充:

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