Socket Receive 避免 Blocking
我们知道 Socket Blocking 属性默认true . 表明Socket 处于同步调用 , Connect , 或 Send , Receive 需等待动作 完成才能继续执行。
有一种应用场景 , Socket 处于 同步调用状态。 我们希望 Receive 时,若没数据,立即返回,而不是阻塞状态。 这里用到两个属性:
Available : 返回可读取字节数
Poll : 检测Socket 状态(是否可读,可写,及异常情况)。无法检测物理层断开产生异常
示例代码:
#region socket 测试
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Blocking = true;
// Connects to host using IPEndPoint.
s.Connect("42.121.252.58", 80);
// s.Connect("192.168.113.128", 11000);
if (!s.Connected)
{
Console.WriteLine("Unable to connect to host");
}
byte[] byt = new byte[4096];
int length;
if (!s.Poll(100, SelectMode.SelectRead))
{
Console.WriteLine("socket not read...");
}
if (!s.Poll(50, SelectMode.SelectWrite))
{
Console.WriteLine("socket not write...");
}
string strRequest = @"GET http://www.cnblogs.com/ HTTP/1.1
Host: www.cnblogs.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: deflate
Cookie: __utma=226521935.655192264.1463987470.1467102370.1467253211.26; __utmz=226521935.1467253212.26.16.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; _ga=GA1.2.655192264.1463987470; CNZZDATA2017822=cnzz_eid%3D985476095-1464072054-null%26ntime%3D1464072054; pgv_pvi=6786726912; AJSTAT_ok_times=10; CNZZDATA1000085291=2001773208-1464232710-null%7C1464232710; Hm_lvt_5d6cc4516947da0ee2209a48877c77e9=1464232694,1464232700,1464233056,1464234704; Hm_lvt_3c14eade5a5788be714db0f403aeaf46=1464592341,1464597543; CNZZDATA2081367=cnzz_eid%3D999995175-1464743380-null%26ntime%3D1464743380; CNZZDATA1943205=cnzz_eid%3D1332194-1464919429-null%26ntime%3D1464919429; CNZZDATA706677=cnzz_eid%3D1663091018-1465265577-null%26ntime%3D1465265950; CNZZDATA5343953=cnzz_eid%3D1996425634-1465290765-null%26ntime%3D1465290765; a8178_times=1; CNZZDATA1028890=cnzz_eid%3D713750658-1465715751-null%26ntime%3D1465715751; CNZZDATA2686777=cnzz_eid%3D1376577942-1465895035-http%253A%252F%252Fwww.cnblogs.com%252F%26ntime%3D1465895035; SyntaxHighlighter=csharp; CNZZDATA1258105384=1452308944-1466386727-http%253A%252F%252Fwww.cnblogs.com%252F%7C1466397796; CNZZDATA1259569345=1538663036-1466750971-http%253A%252F%252Fwww.cnblogs.com%252F%7C1466750971; __utmc=226521935; .CNBlogsCookie=6A451D1565F1FA00C8931473EEFE1D227C0F57F40018603D027DDA2C24697584375F41D8BA527CDF6EB23CD3ABFA9D5BCAB249EE942E36822F74DCFC65AC447C4FCCA67EF6A15F0ABA6BF930FB3434BFC90254CA
Connection: keep-alive
If-Modified-Since: Thu, 30 Jun 2016 03:33:14 GMT
";
int i = s.Send(Encoding.UTF8.GetBytes(strRequest));
Console.WriteLine("成功发送数据:{0}", i);
//发送数据后等待 50 ms
System.Threading.Thread.Sleep(50);
if (!s.Poll(200, SelectMode.SelectRead))
{
Console.WriteLine("re: socket not read...");
}
else
{
// byt = new byte[1];
do
{
length = s.Receive(byt);
Console.WriteLine(System.Text.Encoding.UTF8.GetString(byt, 0, length));
//} while (s.Poll(500, SelectMode.SelectRead) && s.Available > 0 && s.Connected);
} while (s.Available > 0);
//Poll 可检测缓冲区是否还有数据可读。 , 如 socket 处于 blocking 状态 , Receive 时 防止 blocking , 可先调用 Poll 检测是否可读, 同时 Available 属性 应大于 0 , 再调用 Receive
// } while (s.Poll(500, SelectMode.SelectRead));
}
if (!s.Poll(50, SelectMode.SelectWrite))
{
Console.WriteLine("re: socket not write...");
}
s.Shutdown(SocketShutdown.Both);
s.Close();
#endregion
Socket Receive 避免 Blocking的更多相关文章
- Socket.Receive 无法预知字节长度的数据接收
话不多说直接上代码: string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; do { bytes = ...
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- socket programming Max size of tcp/ip socket Buffer?
TCP data is buffered at both sender and receiver. The size of the receiver's socket receive buffer d ...
- html5 的 webScoket 和 C# 建立Socket连接
最近使用的web项目中,需要服务器直接触发前端显示效果. 所以研究了一下websocket: 名词解释: WebSocketWebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样 ...
- 同步IO与一部IO、IO多路复用(番外篇)select、poll、epoll三者的区别;blocking和non-blocking的区别 synchronous IO和asynchronous IO的区别
Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. ...
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- C#中自己动手创建一个Web Server(非Socket实现)
目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 ...
- [C#] Socket 通讯,一个简单的聊天窗口小程序
Socket,这玩意,当时不会的时候,抄别人的都用不好,简单的一句话形容就是“笨死了”:也是很多人写的太复杂,不容易理解造成的.最近在搞erlang和C的通讯,也想试试erlang是不是可以和C#简单 ...
- C# .NET Socket封装
Socket封装,支持多客户端,支持大文件传输,支持多线程并发,对较大的Socket包进行分块传输. 封装所要达到的效果,是可以像下面这样使用Socket和服务端通信,调用服务端的方法,让你在使用So ...
随机推荐
- GOLANG 基本数据类型 浮点型
浮点型 主要为了表示小数 也可细分float32和float64两种 float64提供比float32更高的精度 取值范围 类型 最大值 最小非负数 float32 3.40282346638528 ...
- Java开发中经典的小实例-(打印输入重复的值)
import java.util.ArrayList;import java.util.Scanner;public class Test8 { public static void main( ...
- C#知识点总结系列:5、CLR的组成和运转
clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,ironruby,il... ...
- ubuntu12.04 安装 QQ
友情提示:QQ对于第三方平台封杀已经到了丧心病狂的程度,所以不要妄想在linux的QQ能像win系统下的效果,只能祈求能用就好 1.下载QQ安装包 http://pan.baidu.com/s/1ge ...
- Swift根据日期字符串返回日期是星期几
最近在做的一个IOS项目中需要根据日期得出日期代表的是星期几,日期以字符串的形式获得,于是该方法可以简单描述如下: /* * 根据日期格式字符串返回日期代表星期几 * 参数:dateTime,字符串类 ...
- 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)
MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...
- VS2010+Qt+OpenCv(显示图像)
Qt在界面显示窗口中起着越来越重要的作用,从而了解了下如何在Qt中显示一副图像. 该小程序主要注意一下几点: 1.工程属性中设置OpenCV的环境(包含目录和库目录,以及附加依赖项),设置Qt的环境( ...
- Socket.io和Redis写Realtime App 之express初试
第一步:用npm下载express前端框架 注意事项:首先要确保已经安装了node.js和 npm 然后在项目中创建一个package.json文件,不能完全为空不写,至少要有两个大括号,不然怎么证明 ...
- psql
1.sudo passwd postgres 2.sudo -u postgres createuser -P django_login 3.su postgres 4.psql 5.CREATE D ...
- Eclipse中全局搜索和更替
Eclipse全局搜索步骤 使用快捷键"ctrl+H"打开文件搜索对话框,选择"File Search"标签,在Containing text中输入你需要搜索 ...