Unity 异步网络方案 IOCP Socket + ThreadSafe Queue
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的更多相关文章
- iOS 多个异步网络请求全部返回后再执行具体逻辑的方法
对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...
- 事件驱动之Twsited异步网络框架
在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...
- Unity原生渲染方案
Unity原生渲染方案 作者:3dimensions three_dimensions@live.cn 本文为原创内容,转载请注明出处. 做这个的动机是想在原生代码中使用Unity的材质系统绘制,同时 ...
- Python自动化运维之15、网络编程之socket、socketserver、select、twisted
一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议 TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...
- 浅谈K8S cni和网络方案
此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...
- u3d局域网游戏网络(c# socket select 模型)——续
原文:http://www.cnblogs.com/saucerman/p/5555793.html 因为项目要加语音.语音数据都非常大.所以顺带就把之前写的网络模块一起测试了. 然后发现了一些bug ...
- u3d局域网游戏网络(c# socket select 模型)
之前写了一篇. 发完之后第二天实际应用到游戏之后还是发现了一些小毛病. 比如网络模块有重复使用(多对象)的情况.所以将静态类该成了普通类. 比如安卓下会有些异常出现导致游戏逻辑不正常.所以网络相关的函 ...
- android内部培训视频_第四节(1)_异步网络操作
第四节(1):异步网络操作 一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMa ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
随机推荐
- java switch笔记
1. 在Java7之前,switch只能支持byte.short.char.int或者其对应的封装类以及Enum类型 2. Java7后,开始支持String 3. switch语句中,表达式的值不能 ...
- ArrayList原理分析(重点在于扩容)
首先,ArrayList定义只定义类两个私有属性: /** * The array buffer into which the elements of the ArrayList are stored ...
- TortoiseSVN忽略文件夹
因为平时要做一些主干.分支的版本控制,发布增量补丁包工作,所以经常使用TortoiseSVN客户端.当然,eclipse中也安装了SVN插件,不过在打补丁方面感觉不如客户端.现在遇到了一个问题:同一项 ...
- c++之初级的消息队列及线程池模型
1.最近项目不是很忙,结合之前看的一些开源代码(skynet及其他github代码)及项目代码,抽空写了一个简单的任务队列当做练习. 2.介绍: 1)全局队列中锁的使用:多线程下,全局队列需要加锁,本 ...
- 如何查看一个进程打开哪些fd及对应的文件或套接字操作
- redis_port.py
!/usr/bin/env python import os import json import simplejson as json t=os.popen("""su ...
- C# 导出导入TXT文件
导出TXT关键类: using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...
- C和C#两种方式实现邮件的简单发送
内容为通过两种方式发送邮件--1.C语言发送邮件 2.C#发送邮件 一,C语言进行邮件的发送 C语言发送邮件的步骤的简单解析: 1.创建TCP连接 socket() 2.连接到邮箱服务器 ...
- 修改sublime侧边栏的颜色
Ctrl+Shift+P -> install -> 搜索安装包SyncedSidebarBg,自动同步侧边栏底色为编辑窗口底色.
- JS实现的base64加密、md5加密及sha1加密详解
1.base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset ...