蓝盟IT外包,浅析Linux套接字编程中的五大风险

发布者:上海IT外包来源:http://www.lanmon.net点击数:930


风险1 .忽略返回状态
第一个风险很明显,但这是开发初学者最容易犯的错误。 忽略函数的返回状态可能会在失败或部分成功时丢失。 相反,这可能会传播错误,很难确定问题的来源。
捕获并检查所有返回状态,而不忽略。 想想清单1中显示的例子。 套接字send函数。
风险2 .对等插座闭包
UNIX的有趣之处是几乎任何东西都可以看作一个文件。 文件本身、目录、管线、设备和套接字都被视为文件。 这是一个新的抽象,意味着一组可用于各种设备类型的API。
考虑从文件中读出一定数量的字节的read  API函数。 read函数返回读取的字节数(达到指定的最大值)。 或-1,表示错误。 或者0,如果到达文件末尾。
如果一个套接字完成了read操作,并得到了0的返回值,则表示远程套接字端的对等层调用了close  API方法。 该指示使得描述符不能读取与文件读取相同的——个额外数据。

风险3 .地址使用错误(EADDRINUSE  )

可以使用bind  API函数将地址(接口和端口)绑定到套接字端点。 您可以在服务器设置中使用此函数来限制连接可能到达的接口。 也可以在客户端设置中使用此函数来限制提供的连接使用的接口。 bind最常见的用法是将端口号与服务器相关联,并使用通配符地址(INADDR_ANY  )。 这使任何接口都可以用于到达的连接。
bind通常遇到的问题是试图绑定已经使用的端口。 此陷阱可能不存在活动套接字,但禁止由TCP套接字状态TIME_WAIT引起的绑定端口(bind返回EADDRINUSE  )。 插座关闭后,该状态将保持约2~4分钟。 TIME_WAIT状态结束后,套接字将被删除,并且可以顺利重新绑定地址。

等到TIME_WAIT结束可能会很生气。 特别是在开发套接字服务器时,需要停止服务器,进行更改,然后重新启动。 幸运的是,有办法避免TIME_WAIT状态。 可以将SO_REUSEADDR套接字选项应用于套接字,以便端口可以立即重用。请考虑下面的例子。 绑定地址之前,使用SO_REUSEADDR选项调用setsockopt。 要允许地址重复使用,请将整数参数(on  )设置为1 (否则可以设置为0以禁止地址重复使用)。

文/上海蓝盟 IT外包专家

IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部