- 浏览: 1016381 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
1、
为了增加效率,可以考虑采用无异常的函数
在
.net2.0
中
Socket.Send,Socket.Receive
有了无异常的函数
Socket.Send(Byte[], Int32, Int32, SocketFlags, SocketError)
Socket.Receive(Byte[], Int32, Int32, SocketFlags, SocketError)
减少不必要的异常,就等于增加效率。
2
、
Socket.Connected
不是当前的
Socket
状态
MSDN
原文:获取一个值,该值指示
Socket
是在上次
Send
还是
Receive
操作时连接到远程主机。
应当如何解决呢?
Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。 如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035) ,则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
3 、要用 Socket.Poll 判断是否可以接收,不要用 Socket.Available
虽然 Socket.Available 可以偷窥到当前 Recv 缓冲区字节数,而且 Available 是 Poll 速度的两倍,但是 MSDN 说到 :如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。
所以当网络断开的时候单纯使用 Socket.Available 判断是否 recv 到数据会存在不知道客户端已经断开 Bug
补充: 不推荐使用 Socket.Poll 对 Socket 的列表遍历,应当使用 Socket.Select (或者其他模型), Socket.Poll 是对 Socket.Select 的封装,执行 Socket.Poll 耗时是非阻塞 Socket.Recv 的三倍。
4 、非阻塞模式不能采用 Receive 的返回值表示是否断开
第 3 条说道:如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 Receive 方法将立即完成并返回零字节。但这并不能阻塞模式说明 Socket 已经断开, 这一条和 C 的 recv 函数不同,需要特别注意 。需要判断 out 出来的 SocketError ,当不为 SocketError.Success 、 SocketError.Interrupted 和 SocketError.WouldBlock 时就可以认为网络已经断开。
5 、 Send 可能出现缓冲区满的情况
判断 out 出来的 SocketError ,如果等于 SocketError.WouldBlock ,则是 Send 缓冲区已满,应断开该 Socket ,否则影响整体速度,而不应当 again, 反过来说允许的错误码只有 SocketError.Interrupted ,此时可以重来一次。
6 、主动断开 Socket
MSDN 说道 : 如果当前使用的是面向连接的 Socket ,则必须先调用 Shutdown 方法,然后才能关闭 Socket 。这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。
所以,网络库的 Close 函数可以封装为先调用 Shutdown(SocketShutdown.Both) ,在调用 Close() 。
7 、 Socket 已经关闭 (Close) 但不能在另一端断开
一端 Scoket 已经关闭了,但另一端短时间内仍可以发送数据!这个问题还没有找到解决办法的,但原因已知, 在《 Windows 网络编程技术》一书 (P139-P140) 中说道 : 被动关闭的情况下,应用程序会从对方那里接收一个 FIN 包,并用一个 ACK 包做出响应。此时,应用程序的套接字会变成 ClOSE_WAIT 状态。由于对方已关闭自己的套接字,所以不能再发送数据了。 但应用程序却不同,它能一直发送数据,直到对方的套接字已关闭为止。
发表评论
-
网站统计中的数据收集原理及实现[转]
2012-11-04 23:27 815网站数据统计分析工具是网站站长和运营人员经常使用的一种工 ... -
CentOS 6.2 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
2012-10-22 20:22 941准备篇: 1、配置防火墙,开启80端口、3306 ... -
Maven assembly实现自定义打包(转)
2012-10-12 00:40 1485maven-assembly-plugin : 是maven中 ... -
基于CentOS下Nagios的安装
2012-05-23 22:10 9301.确定Centos系统中是否 ... -
主机网卡无网线连接与虚拟机通信
2012-05-04 15:38 1565环 境: 宿主主机windows xp 虚拟机centos4. ... -
Nginx 简单的负载均衡配置示例[转]
2012-02-28 11:52 990[ 2007-10-29 20:50 | by 张 ... -
简明批处理教程
2011-09-13 16:44 695前言 最近对于批处理技术的探讨比较热,也有不少好的 ... -
WINDOWS批处理命令详解
2011-09-13 16:44 976另外3篇文章: 1. 高手必备:简明批处理教程 2.此 ... -
Windows 批处理bat程序设计简明教程
2011-09-13 16:42 1727Windows 批处理bat程序设 ... -
windows bat 批处理
2011-09-13 16:40 1019echo、@、call、pause、rem(小技巧:用::代替 ... -
nslookup工具的使用方法
2011-07-23 14:13 905配置好DNS服务器,添加 ... -
Eclipse 调试器和 Debug 视图
2011-06-24 12:32 1833Eclipse 调试器和 Debug 视图 2007-11- ... -
提高代码质量及字节码如何防止内存错误
2011-06-01 12:26 977大多Java 程序员 知道他们的程序通常不会被编译为本机代 ... -
需求的管理
2011-05-31 09:14 1近年来,信息系统项目的规模越来越大,复杂度越来越高。由于管理上 ... -
需求分析的原则
2011-05-31 09:13 5不重视需求过程的项目队伍将自食其果。需求工程 中的缺陷将给项 ... -
如何进行软件需求分析
2011-05-31 09:11 6需求的定义包括从用户 ... -
客户需求文档 MRD 和项目需求分析文档
2011-05-31 09:01 15102008/07/23, 12:00 上午 ... -
亿级数据的高并发通用搜索引擎架构设计
2011-05-15 18:00 1356Author: study | May be ... -
给右键菜单加入CMD命令行快速通道
2011-05-04 23:56 979很多人都很喜欢在CMD命令行下来操作计算机,我也是其中之一。 ... -
开发你的第一个Firefox插件【转】
2011-04-21 21:54 694搭建你的应用开发环境 Firefox相关设置的调节 创建P ...
相关推荐
适合新手学习的网络socket编程笔记,内容详细简单明了。
Perl Socket 编程笔记 Perl Socket 编程笔记是 Perl 语言中 Socket 编程的使用方法和示例程序的集合,适合初学者。下面是 Perl Socket 编程的详细说明: 一、使用 Perl Socket API 首先需要载入 Socket 模块,即 ...
本学习笔记将带你深入理解这一领域,特别是通过Socket接口进行的网络通信。Socket是操作系统提供的一种通信机制,它允许应用程序创建并管理网络连接,进行数据传输。 **TCP/IP协议族** TCP/IP(Transmission ...
这份"Socket网络编程学习笔记"涵盖了从基础概念到高级技术的全面知识,对于初学者来说是一份非常有价值的参考资料。以下是对这份笔记内容的详细解读: 1. **Socket基本概念**:Socket在计算机网络中扮演着桥梁的...
Socket基础知识是计算机网络编程中的重要概念,主要用于实现进程间的通信,...通过阅读提供的“SOCKET基础知识笔记.docx”文档,你将更深入地理解Socket的工作原理、使用方法和实际应用,进一步提升你的网络编程能力。
Socket网络编程是构建分布式应用程序的基础,它允许两个网络上的进程之间进行双向通信。在本文中,我们将探讨在TCP...在后续的学习笔记中,作者还将探讨如何在消息中传递实体类信息,这将进一步扩展网络通信的能力。
本笔记将深入探讨Linux Socket编程的基本概念、API使用以及常见问题。 首先,我们来了解什么是Socket。Socket,即套接字,是网络通信中的一个抽象概念,它代表了通信两端的一个端点。在Linux中,Socket分为流式...
### C# Socket编程知识点 #### 一、Socket概念与作用 **Socket** 是计算机网络通信中的基础组件之一,它提供了一种方式使得不同主机或同一主机内的进程能够通过网络进行通信。在C#中,Socket 的实现主要依赖于 **...
以下是对Socket学习笔记的详细解释: 1. **Socket构造方法**: - `Socket()`:创建一个未连接的Socket对象。 - `Socket(InetAddress address, int port)`:创建一个Socket并连接到指定的IP地址和端口。 - `...
### Socket网络编程基础知识点 #### 一、IP地址操作类详解 在进行Socket网络编程时,熟练掌握IP地址的操作是至关重要的。以下是两个关键的类:`IPAddress`和`IPEndPoint`。 ##### 1. `IPAddress`类 `IPAddress`...
WindowsSocket学习笔记.docx
WindowsSocket学习笔记.pdf
在Android平台上,开发一个Socket服务器是一项常见的任务,它允许设备与其他设备或服务器进行低级的网络通信。Socket编程是网络编程的基础,它提供了一种在不同计算机之间交换数据的机制。下面我们将深入探讨Android...
在Android开发中,Socket通信是实现设备间数据传输的重要手段,尤其在构建网络服务和进行设备间的实时交互时。本文将深入探讨如何在Android平台上创建一个Socket客户端,以及如何通过TCP协议进行数据的发送和接收。 ...
C#SOCKET编程笔记.pdf
1.1 Socket通信: Socket通信是计算机网络中实现不同设备间通信的一种机制。在TCP/IP协议栈中,Socket是应用程序通过编程接口(API)与网络服务交互的方式。它提供了在网络中两台计算机之间创建、管理和维护连接的...