Unity IOCP Socket + ThreadSafe Queue

1.Socket.BeginReceive系列接口在unityweb下是不正常的,页面刷新会导致问题

2.自己维护线程,会带来一点小麻烦

3.下面采用iocp+threadsafequeue 来实现异步网络
```
public class UserToken
{
public Socket sock;
public int offset;
public byte[] buf;
public bool isBody;
public TQueue<byte[]> q; // threadsafe queue public int Len {
get {
return buf.Length - offset;
}
}
}
``` ```
static void IO_Completed (object sender, SocketAsyncEventArgs e)
{
switch (e.LastOperation) {
case SocketAsyncOperation.Connect:
ProcessConnect (e);
break; case SocketAsyncOperation.Receive:
ProcessReceive (e);
break; case SocketAsyncOperation.Send:
ProcessSend (e);
break;
default:
Debug.Log ("error: " + e.LastOperation);
throw new Exception ("Invalid operation completed");
}
}
``` connect后进行receive ```
private static void ProcessConnect (SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success) {
// Successfully connected to the server
Debug.Log ("connect success"); var token = e.UserToken as UserToken;
var sock = token.sock;
var q = token.q; e.UserToken = new UserToken{
sock = sock,
q = q,
offset = 0,
isBody = false,
buf = new byte[4]
}; var ut = (UserToken)e.UserToken;
e.SetBuffer (ut.buf, ut.offset, ut.Len);
bool willRaiseEvent = ut.sock.ReceiveAsync (e);
if (!willRaiseEvent) {
ProcessReceive (e);
} } else {
throw new SocketException ((int)e.SocketError);
}
}
``` 使用线程安全的队列接收receive的数据 ```
ut.q.Enqueue (ut.buf);
```

  

Unity 异步网络方案 IOCP Socket + ThreadSafe Queue的更多相关文章

  1. iOS 多个异步网络请求全部返回后再执行具体逻辑的方法

    对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...

  2. 事件驱动之Twsited异步网络框架

    在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...

  3. Unity原生渲染方案

    Unity原生渲染方案 作者:3dimensions three_dimensions@live.cn 本文为原创内容,转载请注明出处. 做这个的动机是想在原生代码中使用Unity的材质系统绘制,同时 ...

  4. Python自动化运维之15、网络编程之socket、socketserver、select、twisted

    一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议       TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...

  5. 浅谈K8S cni和网络方案

    此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...

  6. u3d局域网游戏网络(c# socket select 模型)——续

    原文:http://www.cnblogs.com/saucerman/p/5555793.html 因为项目要加语音.语音数据都非常大.所以顺带就把之前写的网络模块一起测试了. 然后发现了一些bug ...

  7. u3d局域网游戏网络(c# socket select 模型)

    之前写了一篇. 发完之后第二天实际应用到游戏之后还是发现了一些小毛病. 比如网络模块有重复使用(多对象)的情况.所以将静态类该成了普通类. 比如安卓下会有些异常出现导致游戏逻辑不正常.所以网络相关的函 ...

  8. android内部培训视频_第四节(1)_异步网络操作

    第四节(1):异步网络操作  一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMa ...

  9. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

随机推荐

  1. 【前端】Flex 布局教程:语法篇 [转]

    网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...

  2. Hive创建一个简单的UDF

    创建一个类 package com.dufeng.hive; import org.apache.commons.lang.StringUtils; import org.apache.hadoop. ...

  3. 如何设置hyper-v下的ubuntu虚拟机分辨率

    1.登陆ubuntu虚拟机 2.vi /etc/default/grub,改变如下内容: 改变前: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" ...

  4. python print和strip

    在使用这两个模块时犯过错误,总结如下: 1.print print在打印时会自动加上换行,例如: >>> for i in xrange(1,5): ... print i ... ...

  5. Asp.Net MVC 缓存设计

    Asp.Net MVC 缓存: 1. 可以直接在Controller,Action上面定义输出缓存OutputCache,如下,第一次请求这个Index的时候,里面的代码会执行,并且结果会被缓存起来, ...

  6. sqlserver 遍历表

    use Research go ); ) NOT NULL, [mrs] date); DECLARE Table_Cursor CURSOR FOR--包含有列‘sigdate’的表 select ...

  7. jsplumb 的初次使用

    最近的项目要能创建流程, 流程配置什么的就找了 jsplumb 来做流程的显示配置.经过两天的研究成果已经很明显了 参考了以下一些大神们的博客: jsplumb 中文教程 连线绘图工具库介绍 附简单在 ...

  8. js中的内部属性与delete操作符

    本文正式地址:http://www.xiabingbao.com/javascript/2015/08/03/javascript-delete-configurable 在讲解Configurabl ...

  9. 【转至nmap】nc命令

    什么是nc nc是netcat的简写,有着网络界的瑞士军刀美誉.因为它短小精悍.功能实用,被设计为一个简单.可靠的网络工具 nc的作用 (1)实现任意TCP/UDP端口的侦听,nc可以作为server ...

  10. bzoj 1087 状压dp

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4130  Solved: 2390[Submit][ ...