2008年12月28日星期日
同步I/O(阻塞I/O),异步I/O(非阻塞)·百家电脑学院
同步I/O(为什么叫做阻塞I/O),异步I/O(为什么叫做非阻塞)?写进去的和读出来的内容是一致叫做同步,而阻塞时是指当写/读完成时,要等待读/写在物理上完成后,才返回,这样才能保持读写或写读的一致性(因为这样才认为阻塞是同步吗?)
[ 本帖最后由 SybaseLU 于 2007-6-11 10:33 编辑 ]
rrrrrrrr8 2007-6-11 02:35
我只是很清楚什么叫阻塞和非阻塞.
I/O同步异步与阻塞非阻塞之间是什么关系,个人认为还不能直截划等号.请高手回答!
wflyfox 2007-6-11 03:03
阻塞模式下,调用accept,connect,read等函数会阻塞进程直到成功或者失败
非阻塞方式下,调用阻塞函数时(如read),如果没有数据可读,立即返回EAGAIN,不会阻塞在函数调用。
什么叫同步、异步呢?
请解答
SybaseLU 2007-6-11 03:56
1 众所周知,人们常常将read/write/...认为是阻塞I/O【不是还可以通过打开模式设定是NOBLOCK或是BLOCK吗?为什么直接说他们是阻塞I/O呢?】,而标准的ANSI 的fread/fwrite..都是非阻塞I/O【等待在物理上完成实际的I/O操作】
2 如果在一个进程中至少有2个以上的描述符,假设是fd1, fd2,如果需要将fd1的输入送到fd2上,将fd2的输出送到fd1的输入上,这时进程同时对2个输入和2个输出进行读写,采用非阻塞read/write, 他们如何被阻塞,而不得不采用select多路转换呢?
xhl 2007-6-11 04:19
原帖由 wflyfox 于 2007-6-11 11:03 发表
阻塞模式下,调用accept,connect,read等函数会阻塞进程直到成功或者失败
非阻塞方式下,调用阻塞函数时(如read),如果没有数据可读,立即返回EAGAIN,不会阻塞在函数调用。
什么叫同步、异步呢?
请解答 [/quote]
同步,异步的概念本来是通信领域的, 很难解释清楚, 但我肯定他跟阻塞非阻塞完全没有任何关系。
在这里的同步异步, 我个人的理解是函数调用的时候的同步异步。
其实同步方式很好理解, 例如你调用一个function, 当这个function执行完后, 这个方法实现的功能已经完成。这里往往会跟阻塞混淆,其实是因为你采用了同步方式执行代码, 才阻塞了你的thread或者process. 而不是因为阻塞,才叫同步。
异步方式就不提供这种保证, 当你用异步方式调用一个function的时候,这个方法会马上返回,事实上多数情况
下这种function call只是向某个任务执行体提交一个任务而已。 而你的主thread可以继续执行其他的事情, 不必等待(阻塞), 而当那个任务执行体执行完你提交的这个任务后,它会通过某种方法callback给你的thread, 告诉你,你的这个任务已经完成。
实际上,在目前的应用中, 很少有真正实现异步IO的(AIO), 听说(Windows 完成端口跟bsd kqueue实现了, 只是听说而已), 而通过select/poll等实现的不能算是AIO,只能说是个类似的或者是假冒的。。
因为用select/poll实现的情况下,他们多半都是把调用thread作为执行体thread的。
上面完全是个人理解,欢迎指正!
flw2 2007-6-11 04:26
我觉得阻塞和非阻塞主要是指读,而同步和异步是说写
非阻塞就是说: 如果没有数据我宁愿不要了,不要让我等,我还要干别的,我一会再来看有没有。
阻塞就是: 如果没有我要的数据,我的程序无法继续下去,所以没有就等等吧,没有关系,我没别的事情
同步就是写的时候真写了,而不是透明地放在某个地方。
异步就刚好相反了
不管是那个层次,比如fflush fsync等,都是说不要给我缓存,比如写一个优盘上的文件,优盘马上要被拔掉,那么写完之后很可能需要同步一下(虽然其实umount也肯定会同步)
zx_wing 2007-6-11 05:07
[quote]原帖由 xhl 于 2007-6-11 12:19 发表
同步,异步的概念本来是通信领域的, 很难解释清楚, 但我肯定他跟阻塞非阻塞完全没有任何关系。
在这里的同步异步, 我个人的理解是函数调用的时候的同步异步。
其实同步方式很好理解, 例如你调用一 ... [/quote]
大概如此,不过只讲了概念,没有讲细节。我就简单补充一下linux中SIO(同步IO)和AIO(异步IO)机制
1.read/write:
对于read操作来说,它是同步的。也就是说只有当申请读的内容真正存放到buffer中后(user mode的buffer),read函数才返回。在此期间,它会因为等待IO完成而被阻塞。研究过源码的朋友应该知道,这个阻塞发生在两个地方:一是read操作刚刚发起,kernel会检查其它进程的need_sched标志,如果有其它进程需要调度,主动阻塞read操作,这个时候其实I/O操作还没有发起。二是I/O操作发起后,调用lock_page对已经加锁的页面申请锁,这时由于页面已经加锁,所以加锁操作被阻塞,从而read操作阻塞,直到I/O操作完成后页面被解锁,read操作继续执行。所以说read是同步的,其阻塞的原因如上。
对于write操作通常是异步的。因为linux中有page cache机制,所有的写操作实际上是把文件对应的page cache中的相应页设置为dirty,然后write操作返回。这个时候对文件的修改并没有真正写到磁盘上去。所以说write是异步的,这种方式下write不会被阻塞。如果设置了O_SYNC标志的文件,write操作再返回前会把修改的页flush到磁盘上去,发起真正的I/O请求,这种模式下会阻塞。
2.Direct I/O
linux支持Direct I/O, 以O_DIRCET标志打开的文件,在read和write的时候会绕开page cache,直接使用user mode的buffer做为I/O操作的buffer。这种情况下的read和write直接发起I/O操作,都是同步的,并会被阻塞。
3.AIO
目前大多数的linux用的AIO是基于2.4内核中的patch,使用librt库中的接口。这种方式实现很简单,就是一个父进程clone出子进程帮其做I/O,完成后通过signal或者callback通知父进程。用户看来是AIO,实质还是SIO。linux kernel中AIO的实现概念类似,只不过是以一组kernel thread去做的。这些kernel thread做I/O的时候使用的是和Direct I/O相同的方式。
4.mmap()
抛开它中讲vm_area和page cache映射在一起的机制不说。真正发起I/O时和read、write使用的是相同的机制,同步阻塞。
就简单的介绍一下,欢迎指正。
zx_wing 2007-6-11 05:10
[quote]原帖由 flw2 于 2007-6-11 12:26 发表
我觉得阻塞和非阻塞主要是指读,而同步和异步是说写
非阻塞就是说: 如果没有数据我宁愿不要了,不要让我等,我还要干别的,我一会再来看有没有。
阻塞就是: 如果没有我要的数据,我的程序无 ...
>>我觉得阻塞和非阻塞主要是指读,而同步和异步是说写
同步、异步主要是指你读/写的内容和目标磁盘上对应的block时不时一样的
阻塞、非阻塞是指发起操作的函数是马上返回,还是被block直到操作完成"
2008年12月24日星期三
PHP的Socket函数参考 - ◇Linux程序设计交流区 - LPI中文论坛 ——— 全球最大的LPI认证交流社区! - Powered by Discuz!
这些Socket函数直接跟互联网的协议进行发送信息。相对于fopensock的流来讲,他们操作在一个比较底层的级别。通常,他们都是对C 函数进行封装,并且名称都类似。如果你有使用C进行socket编程的经验,那么使用这些函数将是非常熟练的。我们这里不讨论特别详细的socket编程。
使用这些函数能够解决高层级别函数所不能解决的难题。使用这些函数能够实现类似fopen的功能,你也许有很多方法来实现socket的功能,比如在PHP中使用CLI(Command-line Interface)来实现的Internet守护进程。
resource socket_accept(resource socket)
在你的脚本服务器端中,使用socket_accept接受一个进入的连接。你必须首先产生一个socket,绑定它到一个名字,并且设置它监听一个端口。在块模式中,socket_accept将产生一个唯一接受后的连接。在非块模式中,它没有建立连接则返回false。另外,当你有了一个新的socket资源后就能够进行读写操作。
下面我们将示范一个简单的回显服务器端。它运行在CLI(命令行)下面,它在12345端口等待客户端的连接。
socket_accept
<?php
set_time_limit(0);
//create the socket
if(($socket = socket_create(AF_INET, SOCK_STREAM, 0)) < 0){
print('Couldn't create socket: ' . socket_strerror(socket_last_error()) . '\n');
}
//bind it to the given address and port
if(($error = socket_bind($socket, gethostbyname($_SERVER['HOSTNAME']), 12345)) < 0){
print('Couldn't bind socket: ' . socket_strerror(socket_last_error()) . '\n');
}
if(($error = socket_listen($socket, 5)) < 0){
print('Couldn't list on socket: ' .
socket_strerror(socket_last_error()) . '\n');
}
while(TRUE){
//wait for connection
if(($accept = socket_accept($socket)) < 0){
print('Error while reading: ' . socket_strerror($message) . '\n');
break;
}
//send welcome message
socket_write($accept, 'Connection accepted\n');
print(date('Y-m-d H:i:s') . ' STATUS: Connection accepted\n');
ob_flush();
while(TRUE){
//read line from client
if(FALSE === ($line = socket_read($accept, 1024))){
print('Couldn't read from socket: ' .
socket_strerror(socket_last_error()) . '\n');
break 2;
}
if([email=%21@socket_write%28$accept]!@socket_write($accept[/email], 'ECHO: $line')){
print(date('Y-m-d H:i:s') . ' STATUS: Connection interrupted\n');
break;
}
print(date('Y-m-d H:i:s') . ' READ: $line');
ob_flush();
}
socket_close($accept);
}
?>
bool socket_bind(resource socket, string address, integer port)
这个socket_bind()把一个socket资源绑定在一个地址上。这个socket必须由socket_create()函数返回的一个资源。这个地址必须是一个IP地址或者是一个保存Unix socket的路径。如果是运行在Internet上的socket,你还必须提供一个端口。
socket_clear_error(resource socket)
这个函数能够清除制定socket的错误,如果没有指定参数,那么将清除所有socket的错误。
socket_close(resource socket)
socket_close函数关闭一个socket并且清除该socket所占用的内存资源。
boolean socket_connect(resource socket, string address, integer port)
这个函数创建一个客户端到一个端口或者socket的连接。你必须提供一个由socket_create产生的socket。这个address参数必须到一个socket的路径或者是一个IP地址。如果是后者,还必须跟一个数字的端口号。
下面例子演示了使用UDP协议的连接到游戏服务器然后获取信息的过程。
socket_connect
<?php
//create UDP socket
if(($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) < 0){
print('Couldn't create socket: ' .
socket_strerror(socket_last_error()) . '\n');
}
//timeout after 5 seconds
socket_set_option($socket, SOL_SOCKET,
SO_RCVTIMEO, array('sec'=>5,'usec'=>0));
//connect to the RtCW master server
if(!socket_connect($socket, 'wolfmaster.idsoftware.com', 27950)){
print('Couldn't connect: ' .
socket_strerror(socket_last_error()) . '\n');
}
//send request for servers
socket_write($socket, '\xFF\xFF\xFF\xFFgetservers\x00');
//get servers
$server = array();
while(FALSE !== ($line = @socket_read($socket, 4096))){
//parse data
for($i=22; ($i+5) < strlen($line); $i += 7){
$ip = ord(substr($line, $i+1, 1)) . '.' .
ord(substr($line, $i+2, 1)) . '.' .
ord(substr($line, $i+3, 1)) . '.' .
ord(substr($line, $i+4, 1));
$port = (ord(substr($line, $i+5, 1)) * 256) +
ord(substr($line, $i+6, 1));
$server[] = array('ip'=>$ip, 'port'=>$port);
}
}
print('<h1>' . count($server) . ' Servers</h1>\n');
//loop over servers, getting status
foreach($server as $s){
print('<h1>{$s['ip']}:{$s['port']}</h1>\n');
//connect to RtCW server
if(!socket_connect($socket, $s['ip'], $s['port'])){
print('<p>\n' .
socket_strerror(socket_last_error()) .
'\n</p>\n');
continue;
}
//send request for status
socket_write($socket, '\xFF\xFF\xFF\xFFgetstatus\x00');
//get status from server
if(FALSE === ($line = @socket_read($socket, 1024))){
print('<p>\n' .
socket_strerror(socket_last_error()) .
'\n</p>\n');
continue;
}
$part = explode('\n', $line);
//settings are in second line separated by backslashes
$setting = explode('\\', $part[1]);
print('<h2>Configuration</h2>\n');
print('<p>\n');
for($s=1; $s < count($setting); $s += 2){
print('\t\t{$setting[$s]} = {$setting[$s+1]}<br>\n');
}
print('</p>\n');
print('<h2>Players</h2>\n');
$lastPlayer = count($part) - 1;
for($p=2; $p < $lastPlayer; $p++){
$player = explode(' ', $part[$p]);
print('{$player[2]} Score={$player[0]} ' .
'Ping={$player[1]}<br>\n');
}
print('</p>\n');
ob_flush();
}
print('</table>\n');
socket_close($socket);
?>
resource socket_create(integer family, integer socket_type, integer protocol)
socket_create初始化一个socket的结构。第一个参数是一个protocol family,或者域。你必须使用AF_INET来指定一个Internet连接,或者使用AF_UNIX来指定一个Unix socket连接。第二个参数是一个socket的类型,你可以从下面的表中选择。一般情况下,使用SOCK_STREAM来使用TCP协议,UDP协议使用SOCK_DGRAM。第三个参数指定为一个协议。使用SOL_TCP或SOL_UDP来分别对应TCP和UDP协议。还有一个选择是你能够使用 getprotobyname函数来处理。
Socket 类型
常量 描述
SOCK_DGRAM 自动寻址数据包socket
SOCK_RAW RAW协议接口
SOCK_RDM 可靠交换消息
SOCK_SEQPACKET 顺序数据包socket
SOCK_STREAM 流socket
resource socket_create_listen(integer port, integer backlog)
使用socket_create_listen是一种比socket_create更简单的产生一个socket进行监听。这个产生的socket将监听指定的端口,后面可选的参数backlog是设置允许最大的连接数。
boolean socket_create_pair(integer family, integer socket_type, integer protocol, array handles)
socket_create_pair函数产生一对socket连接。首先前三个参数是对一个socket_create的描述,这个handles参数是一个包含两个socket资源的数组。该函数是对C里面socketpair函数的封装。
socket_create_pair
<?php
if(!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $socket)){
print('Couldn't make sockets!\n');
exit();
}
$child = pcntl_fork();
if($child == -1){
print('Couldn't fork!\n');
exit();
}
elseif($child > 0){
//parent
socket_close($socket[0]);
print('Parent: waiting for message\n');
$message = socket_read($socket[1], 1024, PHP_NORMAL_READ);
print('Parent: got message--$message\n');
socket_write($socket[1], 'Hello, Child Process!\n');
pcntl_waitpid($child, $status);
}else{
//child
socket_close($socket[1]);
socket_write($socket[0], 'Hello, Parent Process!\n');
print('Child: waiting for message\n');
$message = socket_read($socket[0], 1024, PHP_NORMAL_READ);
print('Child: got message--$message\n');
exit(0);
}
?>
value socket_get_option(resource socket, integer level, integer option)
socket_get_option函数返回一个下表中所列的一个添加值,你必须提供一个由socket_create产生的socket资源和一个等级。这个获取的socket级别,可以使用SOL_SOCKET来确定这个级别参数。另外,使用协议,比如象SOL_TCP来表示一个TCP协议。这些选项可能是由socket_set_option设置的。
socket_get_options
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
print('SO_BROADCAST: ' .
socket_get_option($socket, SOL_SOCKET,
SO_BROADCAST) . '<br>\n');
print('SO_DEBUG: ' .
socket_get_option($socket, SOL_SOCKET,
SO_DEBUG) . '<br>\n');
print('SO_DONTROUTE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_DONTROUTE) . '<br>\n');
print('SO_ERROR: ' .
socket_get_option($socket, SOL_SOCKET,
SO_ERROR) . '<br>\n');
print('SO_KEEPALIVE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_KEEPALIVE) . '<br>\n');
print('SO_LINGER: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_LINGER), TRUE) . '<br>\n');
print('SO_OOBINLINE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_OOBINLINE) . '<br>\n');
print('SO_RCVBUF: ' .
socket_get_option($socket, SOL_SOCKET,
SO_RCVBUF) . '<br>\n');
print('SO_RCVLOWAT: ' .
socket_get_option($socket, SOL_SOCKET,
SO_RCVLOWAT) . '<br>\n');
print('SO_RCVTIMEO: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_RCVTIMEO), TRUE) . '<br>\n');
print('SO_REUSEADDR: ' .
socket_get_option($socket, SOL_SOCKET,
SO_REUSEADDR) . '<br>\n');
print('SO_SNDBUF: ' .
socket_get_option($socket, SOL_SOCKET,
SO_SNDBUF) . '<br>\n');
print('SO_SNDLOWAT: ' .
socket_get_option($socket, SOL_SOCKET,
SO_SNDLOWAT) . '<br>\n');
print('SO_SNDTIMEO: ' .
print_r(socket_get_option($socket, SOL_SOCKET,
SO_SNDTIMEO), TRUE) . '<br>\n');
print('SO_TYPE: ' .
socket_get_option($socket, SOL_SOCKET,
SO_TYPE) . '<br>\n');
?>
Socket选项表
选项 描述
SO_BROADCAST 允许自动寻址的socket发送和接受广播包
SO_DEBUG 打开socket调试功能,只有root才有权限打开该选项
SO_DONTROUTE 不接受路由包通过网关
SO_ERROR 获取并且清除最后一次的socket错误,这个选项也许不用设置
SO_KEEPALIVE 打开保持激活状态的消息
SO_LINGER Socket_colse和socket_shutdown的中止消息发送超时,该选项使用一个数组,包括l_onoff和l_linger两个键。
SO_OOBINLINE 把数据直接插入到接受缓冲
SO_RCVBUF 限制接受缓冲的最大字节
SO_RCVLOWAT 延迟通过接受一个最小的数据
SO_RCVTIMEO 延迟报告一个接受超时报告,使用数组的两个键:sec和usec
SO_REUSEADDR 允许重新使用本地地址
SO_SNDBUF 限制发送缓冲的最大字节
SO_SNDLOWAT 延迟发送数据到这个协议当接受一个最小的字节
SO_SNDTIMEO 延迟报告超时错误,当发送发送通过一个时间。该选项使用数组的键值:sec和usec
SO_TYPE 获取socket的类型,该选项可能不用设置
boolean socket_getpeername(resource socket, string address, integer port)
socket_getpeername从指定的一个连接中获取地址和端口。如果连接为Unix socket,那么将返回文件系统的路径。
boolean socket_getsockname(resource socket, string address, integer port)
socket_getsockname放置一个名字到socket中,并且加上address和port参数。失败返回false。
(下面的socket_iovec_* 函数不太了解,不敢乱翻译,保留原文)
boolean socket_iovec_add(resource iovector, integer length)
The socket_iovec_add unction adds an I/O vector to the scatter/gather array.
resource socket_iovec_alloc(integer count, …)
The socket_iovec_alloc function returns a resource for handling a collection of I/O vectors. The first argument specifies the number of vectors. Following arguments specify the length of each vector.
boolean socket_iovec_delete(resource iovector, integer position)
The socket_iovec_delete function removes the I/O vector at the given position.
string socket_iovec_fetch(resource iovector, integer position)
The socket_iovec_fetch function returns the value of the specified vector in the I/O vector resource.
boolean socket_iovec_free(resource iovector)
The socket_iovec_free function frees the memory used for an I/O vector resource.
boolean socket_iovec_set(resource iovector, integer position, string value)
The socket_iovec_set sets the value of I/O vector at the given position.
integer socket_last_error(resource socket)
socket_last_error函数返回操作中的任何socket函数产生的最后错误。你也许在上面函数中设置了socket资源的 socket选项在指定的连接上。下面的表列出了返回的错误代码,你同样可以使用soclet_strerror函数来获取详细的错误。使用 socket_clear_error函数清除socket的错误。
Socket错误代码表
常量 描述
SOCKET_E2BIG 参数列表太长
SOCKET_EACCES 没有许可权限
SOCKET_EADDRINUSE 地址已经被使用
SOCKET_EADDRNOTAVAIL 不能解析请求的地址
SOCKET_EADV 广播(广告)错误
SOCKET_EAFNOSUPPORT Address family不支持的协议
SOCKET_EAGAIN 资源暂时不能获得
SOCKET_EALREADY 操作已经在执行
SOCKET_EBADE 无效的交换
SOCKET_EBADF 错误的文件描述符
SOCKET_EBADFD 文件描述符错误的状态
SOCKET_EBADMSG 错误的消息
SOCKET_EBADR 无效的请求描述
SOCKET_EBADRQC 无效的请求代码
SOCKET_EBADSLT 无效的操作位置
SOCKET_EBUSY 驱动或资源繁忙
SOCKET_ECHRNG 信道号码超出范围
SOCKET_ECOMM 发送通讯错误
SOCKET_ECONNABORTED 软件原因导致通行中断
SOCKET_ECONNREFUSED 连接被拒绝
SOCKET_ECONNRESET 连接被相同的socket重置
SOCKET_EDESTADDRREQ 必须需要目标地址
SOCKET_EDQUOT 超出磁盘配额
SOCKET_EEXIST 文件已存在
SOCKET_EFAULT 错误的地址
SOCKET_EHOSTDOWN 主机已关闭
SOCKET_EHOSTUNREACH 没有路由到主机
SOCKET_EIDRM 表示ID被删除
SOCKET_EINPROGRESS 操作正在执行
SOCKET_EINTR 系统调用被阻止
SOCKET_EINVAL 无效的参数
SOCKET_EIO 输入/ 输出错误
SOCKET_EISCONN 传输终端已经连接
SOCKET_EISDIR 是一个目录
SOCKET_EISNAM 是一个指定的类型文件
SOCKET_EL2HLT 级别2已中止
SOCKET_EL2NSYNC 级别2不同步
SOCKET_EL3HLT 级别3已中止
SOCKET_EL3RST 级别3被重置
SOCKET_ELNRNG 连接号超出范围
SOCKET_ELOOP 太多级别的符号连接
SOCKET_EMEDIUMTYPE 错误的媒介类型(中间类型)
SOCKET_EMFILE 太多打开的文件
SOCKET_EMLINK 太多的连接
SOCKET_EMSGSIZE 消息太长
SOCKET_EMULTIHOP 尝试次数太多
SOCKET_ENAMETOOLONG 文件名太长
SOCKET_ENETDOWN 网络已关闭
SOCKET_ENETRESET 网络中断,连接被重置
SOCKET_ENETUNREACH网络不可达
SOCKET_ENFILE 系统中太多打开的文件
SOCKET_ENOANO 没有正极
SOCKET_ENOBUFS 没有可用的缓存空间
SOCKET_ENOCSI 没有可用的CSI结构
SOCKET_ENODATA 没有可用的数据
SOCKET_ENODEV 没有这样的驱动
SOCKET_ENOENT 没有这样的文件或目录
SOCKET_ENOLCK 没有可用的记录锁
SOCKET_ENOLINK 已经有的服务的连接
SOCKET_ENOMEDIUM 没有媒介被找到
SOCKET_ENOMEM 不能分配内存
SOCKET_ENOMSG 没有指定的消息类型
SOCKET_ENONET 设备不在网络上
SOCKET_ENOPROTOOPT 协议不可用
SOCKET_ENOSPC 没有空间在驱动器
SOCKET_ENOSR 超出的流资源
SOCKET_ENOSTR 驱动不是一个流
SOCKET_ENOSYS 函数没有执行
SOCKET_ENOTBLK 块驱动是必须的
SOCKET_ENOTCONN 传输终端没有连接
SOCKET_ENOTDIR 没有一个目录
SOCKET_ENOTEMPTY 目录为空
SOCKET_ENOTSOCK Socket操作在一个非socket上
SOCKET_ENOTTY 不相符的IO控制器
SOCKET_ENOTUNIQ 在网络上名字不是唯一的
SOCKET_ENXIO 没有这样的驱动或地址
SOCKET_EOPNOTSUPP 操作不支持
SOCKET_EPERM 操作不允许
SOCKET_EPFNOSUPPORT Protocol family不支持
SOCKET_EPIPE 失败的管道
SOCKET_EPROTO 协议错误
SOCKET_EPROTONOSUPPORT 协议不支持
SOCKET_EPROTOTYPE Socket上协议错误的类型
SOCKET_EREMCHG 远程地址已改变
SOCKET_EREMOTE 对象是远程的
SOCKET_EREMOTEIO 远程I/O错误
SOCKET_ERESTART 中断的系统调用将要重新开始
SOCKET_EROFS 文件系统为只读
SOCKET_ESHUTDOWN. 传输端点中断不能发送
SOCKET_ESOCKTNOSUPPORT Socket类型不支持
SOCKET_ESPIPE 不合法的检索
SOCKET_ESTRPIPE 流管道错误
SOCKET_ETIME 定时器到时
SOCKET_ETIMEDOUT 连接超时
SOCKET_ETOOMANYREFS 太多连接无法结合
SOCKET_EUNATCH 无法附加协议驱动
SOCKET_EUSERS 太多用户
SOCKET_EWOULDBLOCK 资源暂时无法获得
SOCKET_EXDEV 无效的交叉驱动连接
SOCKET_EXFULL 交换已满
boolean socket_listen(resource socket, integer backlog)
这个socket_listen函数等待从客户端过来的连接,backlog参数设置允许最多等待连接的队列数。
string socket_read(resource socket, integer length, integer type)
socket_read函数从特定的socket中读取指定的字节,如果错误返回false。缺省下,是采用二进制安全的读取模式。你可以外在的设置type参数为PHP_BINARY_READ来改变读取模式。你也可以把type设置为PHP_NORMAL_READ。
boolean socket_readv(resource socket, resource iovector)
socket_readv函数把读取的数据插入到iovector资源中。
integer socket_recv(resource socket, string buffer, integer length, integer flags)
socket_recv函数读取数据插入到缓冲中。Length参数设置最多读取的字节数,flag参数可以使用MSG_OOB或MSG_PEEK。函数返回读取的字节数。
integer socket_recvfrom(resource socket, string buffer, integer length, string host, integer port)
socket_frcvfrom函数读取数据插入到缓存中。Length参数设置获取最多允许接受的字节数。设置flags参数可以为MSG_OOB 或 MSG_PEEK。PHP设置主机和端口参数适当的值能够获取从主机发出的数据。
boolean socket_recvmsg(resource socket, resource iovector, array control, integer length, integer flags, string host, integer port)
socket_recvmsg函数从socket中读取数据并且插入到一个I/O向量资源中。PHP设置control参数是一个具有三个元素的联合数组:cmsg_level, cmsg_type, 和 cmsg_data。Length参数是一个附加在数据中的关于获取数据的长度参数。Flags参数是设置允许值和返回值。在写的时间,PHP无法执行所有的输出常量。PHP设置host和port参数适当的值是为了获取从远程主机中发送的数据。
(Socket_slect函数没有翻译,因为怕词不达意)
integer socket_select(array read, array write, array exception, integer timeout_seconds, integer timeout_microseconds)
The socket_select function waits for changes to sockets. PHP watches the sockets given in the read array for new data coming in. PHP watches the streams given in the write array for being ready to accept more data. PHP watches the streams given in the exception argument for errors. If the number of seconds specified in the timeout_seconds argument passes, the function returns. Use the optional timeout_microseconds argument to specify a timeout less than 1 second.
The socket_select function returns the number of sockets that changed or FALSE if an error occurred. If the call timed out, this function returns zero. It also modifies the given arrays so that they include only those sockets that changed.
If you have no sockets of a particular type to watch, you may pass an empty array or a variable set to NULL.
integer socket_send(resource socket, string buffer, integer length, integer flags)
socket_send函数把写数据到缓冲中,然后插入到连接中。你必须指定一个缓冲最大可写字节数。你同样可以设置flags参数为空,或者为下面联合常量中的一个:MSG_DONTROUTE和 MSG_OOB。函数结束返回已经写的字节数,失败返回false。
boolean socket_sendmsg(resource socket, resource iovector, integer flags, string address, integer port)
socket_sendmsg尝试发送数据到一个socket。它适合无连接的socket。Iovector参数是一个通过 socket_iovec_alloc函数产生的资源。你必须指定flags参数为:NULL, MSG_DONTROUTE, MSG_OOB,或者是两个联合常量。你应当指定一个地址和一个Internet请求的端口。
Socket_sendmsg函数发送数据返回true,但是不能保证数据一定到达。
integer socket_sendto(resource socket, string buffer, integer length, integer flags, string address, integer port)
socket_sendto函数尝试写数据到buffer缓冲中,并且发送给一个socket。它适合大部分无连接的socket。你必须指定 flags为:NULL,MSG_DONTROUTE,MSG_OOB或者是一个两个联合常量。你还应但指定地址和一个请求的端口。
Socket_sendto函数数据发送出去返回true,但是不能保证数据一定到达。
boolean socket_set_block(resource socket)
socket_set_block函数设置socket插入到一个块模式中,这是缺省模式。在块模式中,I/O操作正对于一个完成的请求。
boolean socket_set_nonblock(resource socket)
socket_set_nonblock函数设置socket插入到意个非块模式中。在非块模式中,I/O操作马上返回,即使没有数据。
boolean socket_set_option(resource socket, integer level, integer option, integer value)
socket_set_option函数给socket设置一个选项。Level参数设置一个标志级别的常量。有效的值包括:SOL_SOCKET, SOL_TCP和SOL_UDP。Option参数必须匹配文章上面的Socket选项表中的常量。
boolean socket_shutdown(resource socket, integer how)
socket_shutdown函数关闭一个关于I/O的socket。设置how为0则中止接受数据,设置为1则停止发送数据,设置为2则中止二者操作。
string socket_strerror(integer error)
socket_strerror函数返回一个错误号的详细错误信息。
integer socket_write(resource socket, string buffer, integer length)
socket_write函数写数据到buffer缓冲中然后输出到socket中。你可以指定length参数来指定缓冲的最大字节数。这个函数通常情况下比socket_send更方便。
boolean socket_writev(resource socket, resource iovector)
socket_writev函数通过I/O向量写数据到一个socket中。"
2008年12月22日星期一
UA-NIC-handle组织号申请教程(ORG.UA免费域名)
来源:互联网 作者:佚名 发布时间:2007-08-05
首先要申请个NIC的个人号或者组织号,推荐组织号
UA-NIC-handle组织号申请方法
有组织号可以一直申请免费的UA米,和Ripn的组织号功能差不多
用组织号或个人号申请UA米,可免费10年
申请地址:https://hostmaster.net.ua/?uanew2
1.在打开页面的右上角选择english使用英文
2.开始注册组织号,注意格式
3.申请成功,回馈信息
4.到邮箱收信,里面有你的组织号密码
查看一封主题为new password的邮件
Quote:
Ваш новый пароль для редактирования регистрационных данных о Вашем nic-handle BNNB: QAUVMTS
Your new password to edit registration data for nic-handle BNNB: QAUVMTS
5.登录https://hostmaster.net.ua/auth/修改密码"
2008年12月19日星期五
怎么把一个字符串数组转换为一个逗号分隔的字符串 Java / J2SE / 基础类 - CSDN社区 community.csdn.net
//楼上兄弟的算法封装为方法,呵呵
public String stringArrayJoin( String[] strArray, String separator ) {
StringBuffer strbuf = new StringBuffer();
for( int i = 0; i < strArray.length; i++ ) {
strbuf.append( separator ).append( strArray[i] );
}
return strbuf.deleteCharAt( 0 ).toString();
}"
2008年12月18日星期四
JAVA字符串处理函数列表一览 | 中文Flex例子
substring()
它有两种形式,第一种是:String substring(int startIndex)
第二种是:String substring(int startIndex,int endIndex)
concat() 连接两个字符串
replace() 替换
它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下:
String replace(char original,char replacement)
例如:String s=”Hello”.replace(’l',’w');
第二种形式是用一个字符序列替换另一个字符序列,形式如下:
String replace(CharSequence original,CharSequence replacement)
trim() 去掉起始和结尾的空格
valueOf() 转换为字符串
toLowerCase() 转换为小写
toUpperCase() 转换为大写
length() 取得字符串的长度
例:
char chars[]={’a',’b’.’c'};
String s=new String(chars);
int len=s.length();
charAt() 截取一个字符
例:
char ch;
ch=”abc”.charAt(1);
返回值为’b’
getChars() 截取多个字符
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
sourceStart 指定了子串开始字符的下标
sourceEnd 指定了子串结束后的下一个字符的下标。因此,子串包含从sourceStart到sourceEnd-1的字符。
target 指定接收字符的数组
targetStart target中开始复制子串的下标值
例:
String s=”this is a demo of the getChars method.”;
char buf[]=new char[20];
s.getChars(10,14,buf,0);
getBytes()
替代getChars()的一种方法是将字符存储在字节数组中,该方法即getBytes()
例:
String s = “Hello!你好!”;
byte[] bytes = s.getBytes();
toCharArray()
例:
String s = “Hello!你好!”;
char[] ss = s.toCharArray();
equals()和equalsIgnoreCase() 比较两个字符串
regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。
boolean regionMatches(int startIndex,String str2,int
str2StartIndex,int numChars)
boolean regionMatches(boolean ignoreCase,int startIndex,String
str2,int str2StartIndex,int numChars)
startsWith()和endsWith()
startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束
equals()和==
equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。
例:String s1=”Hello”;
String s2=new String(s1);
s1.eauals(s2); //true
s1==s2;//false
compareTo()和compareToIgnoreCase() 比较字符串
indexOf()和lastIndexOf()
indexOf() 查找字符或者子串第一次出现的地方。
lastIndexOf() 查找字符或者子串是后一次出现的地方。
StringBuffer构造函数
StringBuffer定义了三个构造函数:
StringBuffer()
StringBuffer(int size)
StringBuffer(String str)
StringBuffer(CharSequence chars)
下面是StringBuffer相关的函数:
length()和capacity()
一个StringBuffer当前长度可通过length()方法得到,而整个可分配空间通过capacity()方法得到。
ensureCapacity() 设置缓冲区的大小
void ensureCapacity(int capacity)
setLength() 设置缓冲区的长度
void setLength(int len)
charAt()和setCharAt()
char charAt(int where)
void setCharAt(int where,char ch)
getChars()
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
append() 可把任何类型数据的字符串表示连接到调用的StringBuffer对象的末尾。
例:int a=42;
StringBuffer sb=new StringBuffer(40);
String s=sb.append(”a=”).append(a).append(”!”).toString();
insert() 插入字符串
StringBuffer insert(int index,String str)
StringBuffer insert(int index,char ch)
StringBuffer insert(int index,Object obj)
index指定将字符串插入到StringBuffer对象中的位置的下标。
reverse() 颠倒StringBuffer对象中的字符
StringBuffer reverse()
delete()和deleteCharAt() 删除字符
StringBuffer delete(int startIndex,int endIndex)
StringBuffer deleteCharAt(int loc)
replace() 替换
StringBuffer replace(int startIndex,int endIndex,String str)
substring() 截取子串
String substring(int startIndex)
String substring(int startIndex,int endIndex)"
Java字符串的方法 - - New - JavaEye论坛
例:char chars[]={'a','b'.'c'};
String s=new String(chars);
int len=s.length();
2、charAt() 截取一个字符
例:char ch;
ch='abc'.charAt(1); 返回'b'
3、getChars() 截取多个字符
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
sourceStart指定了子串开始字符的下标,sourceEnd指定了子串结束后的下一个字符的下标。因此,子串包含从sourceStart到 sourceEnd-1的字符。接收字符的数组由target指定,target中开始复制子串的下标值是targetStart。
例:String s='this is a demo of the getChars method.';
char buf[]=new char[20];
s.getChars(10,14,buf,0);
4、getBytes()
替代getChars()的一种方法是将字符存储在字节数组中,该方法即getBytes()。
5、toCharArray()
6、equals()和equalsIgnoreCase() 比较两个字符串
7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。
boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)
boolean regionMatches(boolean ignoreCase,int startIndex,String str2,int str2StartIndex,int numChars)
8、startsWith()和endsWith()
startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束
9、equals()和==
equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。
例:String s1='Hello';
String s2=new String(s1);
s1.eauals(s2); //true
s1==s2;//false
10、compareTo()和compareToIgnoreCase() 比较字符串
11、indexOf()和lastIndexOf()
indexOf() 查找字符或者子串第一次出现的地方。
lastIndexOf() 查找字符或者子串是后一次出现的地方。
12、substring()
它有两种形式,第一种是:String substring(int startIndex)
第二种是:String substring(int startIndex,int endIndex)
13、concat() 连接两个字符串
14 、replace() 替换
它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下:
String replace(char original,char replacement)
例如:String s='Hello'.replace('l','w');
第二种形式是用一个字符序列替换另一个字符序列,形式如下:
String replace(CharSequence original,CharSequence replacement)
15、trim() 去掉起始和结尾的空格
16、valueOf() 转换为字符串
17、toLowerCase() 转换为小写
18、toUpperCase() 转换为大写
19、StringBuffer构造函数
StringBuffer定义了三个构造函数:
StringBuffer()
StringBuffer(int size)
StringBuffer(String str)
StringBuffer(CharSequence chars)
(1)、length()和capacity()
一个StringBuffer当前长度可通过length()方法得到,而整个可分配空间通过capacity()方法得到。
(2)、ensureCapacity() 设置缓冲区的大小
void ensureCapacity(int capacity)
(3)、setLength() 设置缓冲区的长度
void setLength(int len)
(4)、charAt()和setCharAt()
char charAt(int where)
void setCharAt(int where,char ch)
(5)、getChars()
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
(6)、append() 可把任何类型数据的字符串表示连接到调用的StringBuffer对象的末尾。
例:int a=42;
StringBuffer sb=new StringBuffer(40);
String s=sb.append('a=').append(a).append('!').toString();
(7)、insert() 插入字符串
StringBuffer insert(int index,String str)
StringBuffer insert(int index,char ch)
StringBuffer insert(int index,Object obj)
index指定将字符串插入到StringBuffer对象中的位置的下标。
(8)、reverse() 颠倒StringBuffer对象中的字符
StringBuffer reverse()
(9)、delete()和deleteCharAt() 删除字符
StringBuffer delete(int startIndex,int endIndex)
StringBuffer deleteCharAt(int loc)
(10)、replace() 替换
StringBuffer replace(int startIndex,int endIndex,String str)
(11)、substring() 截取子串
String substring(int startIndex)
String substring(int startIndex,int endIndex)"
2008年12月15日星期一
用 java 检测主机连网状态--CTO_Java技术文章_Java_软件编程
通过几天努力终于把那个问题给解决了,就是用java 检测本机的连网状态,当网络中断时让检测网络,如果连接上网络,便又继续下面的工作.以下是我写的一个类,朋友们可以参考一下 清单一:URLAvailability.java
package xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
/**
*
* 项目名称: xxxxxxxxxx*
* 功能模块名称:
*
* 文件名称为:URLAvailability.java
*
* 文件功能简述: xxxxxxxxxxxxxxxxxxxxxxxxxx *
* 文件创建人:ChenTao
* @author ChenTao
* @version v1.0
* @time 2008-5-31上午10:00:35
* @copyright xxxxxxxxxxxxx */
@SuppressWarnings("unused")
public class URLAvailability {
private static Logger logger = Logger.getLogger(URLAvailability.class);
private static URL urlStr;
private static HttpURLConnection connection;
private static int state = -1;
private static String succ;
private static boolean isCon = false;
private String url;
private String closeTime = null;
private int status = 0;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public static String getSucc() {
return succ;
}
public static void setSucc(String succ) {
URLAvailability.succ = succ;
}
/**
* 功能描述 : 检查URL是否可用
*
* @param url
* 指定检查的网络地址
*
* @return String
*/
public synchronized static String isConnect(String url) {
state = -1;
succ = null;
if (url == null || url.length() <= 0) {
return succ;
}
new URLAvailability().connectState(url);
return succ;
}
/**
* 功能描述 : 检测当前网络是否断开 或 URL是否可连接,
* 如果网络没断开,最多连接网络 5 次, 如果 5 次都不成功说明该地址不存在或视为无效地址.
*
* @param url
* 指定URL网络地址
*
* @return void
*/
private synchronized void connectState(String url) {
this.url = url;
int counts = 0;
while (counts < 5) {
try {
urlStr = new URL(this.getUrl());
connection = (HttpURLConnection) urlStr.openConnection();
state = connection.getResponseCode();
if (state == 200) {
succ = connection.getURL().toString();
}
break;
} catch (UnknownHostException ex) {
if(this.closeTime == null){
DateFormat df = DateFormat.getDateTimeInstance();
closeTime = df.format(new Date());
logger.error("网络连接状态已断开,请检查网络连接设备");
logger.info("断开时间 : " + this.closeTime);
logger.error("程序开始执行每三分钟检测一次网络");
}
try {
status ++;
logger.info("开始第" + status + " 次检测网络状态是否可连接");
Thread.sleep(180000);
} catch (InterruptedException e) {
}
this.connectState(this.getUrl());
} catch (Exception ex) {
counts++;
continue;
}
if(status != 0){
DateFormat df = DateFormat.getDateTimeInstance();
closeTime = df.format(new Date());
logger.info("网络成功连接");
}
}
}
}
大家看到上面我 cache 了UnknownHostException 异常,这个意思是在调用远程主机发生的异常,我们只需要 cache 这个异常就搞定了,不信可试试把网线断开后看看会发生什么
JAVA 检测网络是否为连通状态 ping - 梦幻之旅 - BlogJava
import java.awt.Toolkit;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/** *//**
* @Description:本类开启一个线程检测网络是否连通
* @Author : 惠万鹏
* @Time :2008-1-10
*/
public class NetworkManagement implements Runnable {
private int htmlCodeSize;
private int sleepMillisecond;
private int sleepMillisecondWhenNetWorkUnLinked;
private boolean isSpontaneousNotice;
private static boolean networkIsLinked;
private Thread thread = new Thread(this);
private Toolkit toolkit;
private String[] urls;
public NetworkManagement() {
this.urls = new String[]{'http://www.baidu.com', 'http://www.google.cn'};
this.htmlCodeSize = 50;
this.sleepMillisecond = 5000;
this.sleepMillisecondWhenNetWorkUnLinked = 10000;
this.toolkit = Toolkit.getDefaultToolkit();
thread.start();
}
public void setURLs(String[] urls) {
if (urls != null && urls.length > 0) {
this.urls = urls;
}
}
public void setHtmlCodeSize(int htmlCodeSize) {
if (htmlCodeSize > 0) {
this.htmlCodeSize = htmlCodeSize;
}
}
public void isSpontaneousNotice(boolean isSpontaneousNotice) {
this.isSpontaneousNotice = isSpontaneousNotice;
}
public void setSleepMillisecont(int sleepMillisecont) {
if (sleepMillisecont > 100) {
this.sleepMillisecond = sleepMillisecont;
}
}
public void setSleepMillisecondWhenNetWorkUnLinked(int sleepMillisecont) {
if (sleepMillisecont > 100) {
this.sleepMillisecondWhenNetWorkUnLinked = sleepMillisecont;
}
}
public static boolean IsNetWordLinking() {
return NetworkManagement.networkIsLinked;
}
public void run() {
while (true) {
try {
this.isNetWorkLinked();
if (!NetworkManagement.networkIsLinked) {
this.isPrintMessage(this.isSpontaneousNotice);
Thread.sleep(this.sleepMillisecondWhenNetWorkUnLinked);
}
System.out.println(NetworkManagement.IsNetWordLinking());
Thread.sleep(this.sleepMillisecond);
} catch (Exception e) {
}
}
}
private boolean canGetHtmlCode(String httpUrl) {
String htmlCode = '';
try {
InputStream in;
URL url = new java.net.URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty('User-Agent', 'Mozilla/4.0');
connection.connect();
in = connection.getInputStream();
byte[] buffer = new byte[this.htmlCodeSize];
in.read(buffer);
htmlCode = new String(buffer);
} catch (Exception e) {
}
if (htmlCode == null || htmlCode.equals('')) {
return false;
}
return true;
}
private void isNetWorkLinked() {
boolean tempIsNetWorkLinked = false;
for (int urlsCount = 0; urlsCount < this.urls.length; urlsCount++) {
if (this.canGetHtmlCode(this.urls[urlsCount])) {
tempIsNetWorkLinked = true;
break;
}
}
NetworkManagement.networkIsLinked = tempIsNetWorkLinked;
}
private void isPrintMessage(boolean isPrint) {
if (isPrint) {
toolkit.beep();
StringBuffer message = new StringBuffer();
message.append('------------->');
message.append('网络中断, ');
message.append(this.sleepMillisecondWhenNetWorkUnLinked);
message.append(' 毫秒后再次检测!<-------------');
System.out.println(message.toString());
}
}
public static void main(String[] args) {
NetworkManagement n = new NetworkManagement();
n.isSpontaneousNotice(true);
}
}"
2008年11月13日星期四
2008年10月8日星期三
Protocols and approvals
Protocols and approvals
Worldwide IP and tdM protocols for applications using boards and software from Aculab
Aculab's protocol coverage extends to the broadest range of worldwide call control and signalling protocols with appropriate, host independent regulatory approvals. the list includes many different national and international variants of Signalling System Number 7 (SS7), CAS and ISDN (including Q.931, Q.SIG and DPNSS), for operation over E1 and T1 trunks on our tdM boards. In addition, for IP telephony and VoIP applications, Aculab offers H.323 and SIP stacks for use with our IP and media processing boards.
Combined protocols
Many applications require voice board or IP-based media processing functionality, such as record, playback, DTMF handling, wideband audio conferencing, encoding/transcoding and T.38 fax. All these essential functions and more are available with Aculab's Prosody X IP or DSP boards, which can be combined with any protocol, including SIP and SS7, to deliver powerful, cost-effective, telecoms server-based solutions.
In addition, offering the same core functionality, Prosody S, Aculab's advanced HMP, offers a viable alternative to using IP boards for telco and enterprise applications or service delivery platforms, bringing granular scalability and cost-efficiencies to those familiar with traditional, board-based designs.
Obtaining the software
With the exception of SIGtrAN and Prosody S, which are licensed, all protocols, including SIP and C7, are freely available via a software download utility for use with all of Aculab's board hardware. Developers can simply collect the protocol firmware, free of charge, when they need it, gaining a distinct advantage in terms of system cost and value per channel.
Access the download utility here
Regulatory approvals
Aculab has obtained many country specific, host independent regulatory approvals, such that Aculab's boards can be integrated into PC or server-based solutions without further telecom approvals being needed. In regions where this option is not available, Aculab has experience to offer in support of users seeking system level type approvals.
To discuss your requirements, contact your Account Manager or send an email to sales@aculab.com and one of our representatives will get right back to you.
Summary detail
A detailed summary of the available approvals and protocol information can be viewed as a PDF file. Please note that a number of protocols are used throughout the world, (like DPNSS, Q.SIG and SS7) and are indexed as 'Worldwide' in the tables.
| Country | Protocol | Protocol type | Additional notes | Aculab protocol stack | |
|---|---|---|---|---|---|
| Argentina | R2 CAS | CAS1 | R2T12 | ||
| Australia | TS014 | CCS | No longer supplied | AUSTEL-TS014 | |
| Australia | TS038 | CCS | ETS 300 | ||
| Australia | P2 | CAS1 | TS003/TPH1271/R2D | R2T12 | |
| Belgium | National R2 | CAS1 | R2T12 | ||
| Belgium | National R2 | DTMF CAS1 | BELGU | ||
| Brazil | Euro ISDN | CCS | ETS 300 | ||
| Brazil | MFC R2 | CAS1 | Brazil 5C | R2T12 | |
| Canada | T1 Robbed bit | CAS1 | T1RB | ||
| Chile | MFC R2 | CAS1 | R2T12 | ||
| China | R2 | CAS1 | China#1 | R2T12 | |
| China | Chinese ISDN | CCS | ETS300 | ||
| Colombia | R2 | CAS1 | R2T12 | ||
| Croatia | R2 | CAS1 | R2T12 | ||
| Czech Republic | R2 | CAS1 | R2T12 | ||
| Czech Republic | MFC R2 | CAS1 | Type K | R2T12 | |
| Denmark | National MFC R2 | CAS1 | R2DK | ||
| Egypt | MFC R2 | CAS1 | R2T12 | ||
| EU wide | Euro ISDN | CCS | ETS 300 | ||
| Finland | R2 | CAS1 | R2T12 | ||
| France | MF R1 Socotel | CAS1 | FMFS | ||
| France | VN3 | CCS | No longer supplied | VN3 | |
| France | VN6 | CCS | ETS 300 | ||
| Germany | 1tr6 | CCS | No longer supplied | 1tr6 | |
| Greece | OTE 4 | CAS1 | 4-bit CAS | OTE4 | |
| Greece | OTE 2 | CAS1 | 2-bit CAS | OTE2 | |
| Hong Kong | CR13 IDA-P | CCS | No longer supplied | ETS 300 | |
| Hong Kong | HKTA 2015 | CCS | ETS 300 | ||
| Hong Kong | HKT 2018 Robbed bit | CAS1 | T1HK; AMI or B8ZS encoding | T1HK | |
| India | MFC E&M | CAS1 | R2T12 | ||
| India | MFC R2 | CAS1 | Type 1/2/3 | R2T12 | |
| Indonesia | R2 (Q.421) | CAS1 | Ericsson loop signalling | R2T12 | |
| Indonesia | SMFC R2 | CAS1 | Semi-compelled | IEM | |
| Iran | R2 | CAS | 3-bit decadic | R2T12 | |
| Israel | ETS 300 | CCS | ETS 300 | ||
| Israel | MFC R2 | CAS1 | Israel R2 | R2T12 | |
| Italy | I701 | CAS1 | I701 | ||
| Japan | INS 1500 | CCS | INS1500 | ||
| Jordan | R2 | CAS1 | R2T12 | ||
| Korea | Euro ISDN | CCS | ETS 300 | ||
| Korea | R2 | CAS1 | R2T12 | ||
| Kuwait | R2 | CAS1 | R2T12 | ||
| Latvia | MFC R2 | CAS1 | R2T12 | ||
| Malaysia | MFC R2 | CAS1 | R2T12 | ||
| Malaysia | MFC R2 | CAS1 | IEM | ||
| Malta | MFC R2 | CAS1 | R2T12 | ||
| Mexico | R2 | CAS1 | R2T12 | ||
| Netherlands | ALS70D | CAS1 | T11-53E | ALSN/ALSU | |
| Netherlands | MFC R2 | CAS1 | R2T12 | ||
| New Zealand | TNA134 | CCS | Q.931 | ETS 300 | |
| Norway | National MFC R2 | CAS1 | R2T12 | ||
| Peru | MFC R2 | CAS1 | R2T12 | ||
| Philippines | R2 | CAS1 | R2T12 | ||
| Poland | EuroISDN | CCS | ETS 300 | ||
| Poland | MFC R2 | CAS1 | R2T12 | ||
| Portugal | MFC R2 | CAS1 | R2T12 | ||
| Sierra Leone | MFC R2 | CAS1 | R2T12 | ||
| Singapore | IDA TS ISDN2 | CCS | ETS 300 | ||
| Singapore | Fetex | CCS | FETEX | ||
| Singapore | MFC R2 | CAS1 | R2T12 | ||
| Singapore | MFC R2 | CAS1 | IEM | ||
| South Africa | Euro ISDN | CCS | ETS 300 | ||
| South Africa | MFC R2 | CAS1 | R2T12 | ||
| Spain | MF R1 Socotel | CAS1 | SMFS | ||
| Sweden | CAS extension EL7 | CAS1 | Ericsson ASB/voicemail | EL7 | |
| Sweden | P8 | CAS1 | P8 DDI and P7 non-DDI option | P8 | |
| Taiwan | MF R1 | CAS1 | Modified | T1RB | |
| thailand | National R2 DTMF | CAS1 | R2T12 | ||
| Turkey | R1 | CAS1 | E1LS | ||
| UK | DASS2 | CCS | DASS | ||
| UK | DPNSS | CCS | DPNSS | ||
| UK | BT/MCL Interconnect | CAS1 | Asymmetrical | BTMC | |
| UK | BT Callstream | CAS1 | SIN 205/356 | BTCU/BTCN | |
| UK | PD1 | CAS1 | MCL PD1/DC5A | PD1 | |
| USA | AT&T | CCS | tr41459 | ATT-T1 | |
| USA | DMS 100 | CCS | Nortel DMS (T1) | DMS100 | |
| USA | National ISDN 2 | CCS | NI1 and NI2 | NI2 | |
| USA | National ISDN2 | CCS | NFAS (with D-channel back-up) | NI2 | |
| USA | T1 robbed bit | CAS1 | T1RB | ||
| Worldwide (ex USA) | E1 line side CAS | CAS1 | AT&T Definity and Nortel Meridian | E1LS | |
| Worldwide | MFC R2 | CAS1 | Q.421/Q.441 | R2T12 | |
| Worldwide | SS5 | CAS1 | CCITT SS5 (C5) | SS5 | |
| Worldwide | Decadic CAS | CAS | Generic use with PBXs | R2T12 | |
| Worldwide | E&M type A | CAS1 | Ericsson DC5 and E&M options | EEMA | |
| Worldwide | 30Dli | CAS1 | NEC PA-30DTS | 30Dli | |
| Worldwide | SS7 | CCS | ITU-T: ISUP Q.767; TCAP Q.771-Q.774; SCCP Q.711- Q.714; MTP Q.703, Q.704, Q.707 | ISUP/TCAP | |
| Worldwide | Q.SIG | CCS | QSIG | ||
| Notes: 1. A DSP 65 module is required for DTMF or CAS tone signalling with E1/T1 PCI and Passive monitor PCI boards. A PMXC is needed for SS7 and DTMF or CAS tone signalling with Prosody X variants. 2. Protocols marked ' 3. Aculab's R2T1 firmware provides a generic MFC R2 protocol stack, which uses switches to establish specific national or signalling variants. See the individual protocol release notes available via the Aculab installation tool (AIT). 4. Many CAS protocols provide for selection of either decadic (dial pulse), DTMF or MFR1 or MFC R2 register signalling and a number of line signalling methods. See the individual protocol release notes. 5. the majority of protocols are balanced, meaning that the same protocol may be used at both user and network ends of a link. In some cases user and network ends are established by switches in the firmware. Some protocols are provided by means of separate firmware for user and network ends. See the individual protocol release notes. 6. Some protocols offer both DDI and non-DDI options. See the individual protocol release notes. 7. In some cases the source specification documentation is less than thorough in its treatment of the protocol, leaving operations open to interpretation. Aculab is grateful for any feedback regarding the use of any listed protocol. 8. If you cannot find the protocol you need listed here, we may be able to help, as often, particularly with CAS protocols, an existing variant can prove viable. Aculab's generic MFC R2 stack often proves suitable for use even in countries where it has not already been validated for use against a specification. Aculab are able to compare an existing protocol stack against your specification, or alternatively may be able to produce the required variant for you. Please contact your Account Manager or email sales@aculab.com to discuss your requirements. 9. Developers looking to use 'host independent' approved Aculab products in their complete CT systems should not require further telecoms approval for that system prior to network connection. | |||||
| Protocol | IETF Specification | Feature description |
|---|---|---|
| SIP (session initiation protocol) | RFC 3261 | Session initiation protocol SIP on UDP and TCP SIPS (SIP over TLS) |
| RFC 3262 | Reliable provisional responses | |
| RFC 3310 | SIP authentication | |
| RFC 2327 | Session description protocol (SDP) | |
| RFC 3665 | Basic call flow examples | |
| RFC 3666 | SIP/PSTN call flows | |
| RFC 3264 | Offer/answer model with SDP | |
| RFC 3725 | third party call control best practices | |
| RFC 3515 | the REFER method | |
| RFC 3204 | MIME media types for Q.SIG/ISUP | |
| RFC 2976 | INFO method | |
| RFC 3891 | Replaces header | |
| Draft-ietf-sipping-service-examples-09 | Hold and transfer | |
| Draft-ietf-sipping-cc-transfer-06.txt | Blind transfer for SIP | |
| RFC 3892 | Referred by header | |
| RFC 3261 | TCP support | |
| RFC 3581 | Symmetric signalling ports | |
| Draft-ietf-mmusic-sdescriptions-12 | Secure RTP support | |
| RFC 4028 | SIP session timers | |
| RFC 32651 | Subscribe/specific event notification1 | |
| RFC 3311 | UPDATE method | |
| RFC 3489 | STUN API | |
| MRCP (media resource control protocol) | MRCP v1, draft 7 | |
| MRCP v2, draft 11 | ||
| Protocol | ITU-T Specification | Feature description |
| H.323 | H.323 version 2 | Packet-based multimedia communications systems |
| H.225 version 2 | Including support for fast-start, non-standard data field (NSDF), RAS gatekeeper failover, NSM RAS and connectionless facility messages | |
| H.245 version 3 | Including support for H.245 tunnelling, third party hold, early H.245 and DTMF relay | |
| H.450.1; H.450.2; H.450.3; H.450.4; H.450.6 | Supplementary services (call transfer, call diversion, call waiting and call hold) | |
| H.324M1 | H.324M | Including support for H.223 |
| 3G-324M1 | Including support for H.223 | |
| Note: 1. Roadmap feature, contact your Account Manager for details | ||
| SS7 protocol | National and international variants | Specification compliance |
|---|---|---|
| MTP 2 (message transfer part layer 2) | ITU-T, ANSI, China | Q.703 (1996/white book); ANSI T1.111 (1996); China GF001-9001 (1990) |
| MTP 3 (message transfer part layer 3) | ITU-T, ANSI, China | Q.704 (1996/white book); ANSI T1.111 (1996); China GF001-9001 (1990) |
| ISUP (ISDN user part) | ITU-T, ANSI, ETSI, UK, China | ITU-T ISUP (1997/white book); ANSI ISUP T1.113 (1995); Q.767 International ISUP; China ISUP YDN-038 (1997); ETSI ISUP V4 (2001); UK ISUP (2001); user definable variants1 |
| SCCP (signalling connection control part) | ITU-T, ANSI, China | Q.711-Q.714 (1996/white book); ANSI SCCP T1.112 (1996); China SCCP GF010-95 |
| TCAP (transaction capabilities application part) | ITU-T, ANSI, China | Q.771-Q.774 (1996/white book); ANSI TCAP T1.114 (1996); China TCAP GF011-95 |
| Note: 1. Aculab's SS7 software provides a flexible option through which the user can define other national and international ISUP variants to meet specific needs. | ||
| Country | Approved product | Protocol | Approval standard | Approval number | Additional notes |
|---|---|---|---|---|---|
| Australia | Prosody X PCI with PMX/PMXC1 | Q.931/Q.932 | AS/ACIF S038 | Self declaration | E1 |
| Australia | All PCI/cPCI cards with PM1 | Q.931/Q.932 | AS/ACIF S038 | Self declaration | E1 |
| Brazil | E1/T1 PCI with PM1 | Brazilian ISDN | Anatel | 0030-06-1140 | E1 |
| Brazil | E1/T1 cPCI with PM1 | Brazilian ISDN | Anatel | 0028-06-1140 | E1 |
| Canada | Prosody X PCI with PMX/PMXC1 | Aculab T1 protocols | CS03 part 8 | 2789A-AC5200 | T1 |
| Canada | All Prosody X and E1/T1 PCIe cards | Aculab T1 protocols | CS03 part 8 | 2789A-PCIEX | T1 - fitted with DSP for CAS/SS7 if applicable |
| Canada | All PCI/cPCI cards with PM1 | Aculab T1 protocols | CS03 part | 8 2789A 12217 | T1 - fitted with DSP if applicable |
| China | Prosody X PCI with PMX/PMXC1 | Q.931/Q.932 | Chinese ISDN | 12-7170-060345 | E1 |
| China | E1/T1 PCI with PM1 & 3 | Q.931/Q.932 | Chinese ISDN | 15-5288-020439 | E1 |
| China | E1/T1 cPCI with PM1 & 3 | Q.931/Q.932 | Chinese ISDN | 12 7170 050931 | E1 |
| EU wide2 | Prosody X PCI with PMX/PMXC1 | Q.931/Q.932 | TBR4 | Self declaration under RTTE | E1 protocol also referred to as Euro or ETSI ISDN |
| EU wide2 | All PCI/cPCI cards with PM1 | Q.931/Q.932 | TBR4 | Self declaration under RTTE | E1 protocol also referred to as Euro or ETSI ISDN |
| Hong Kong | Prosody X PCI with 1 DSP and PMX/PMXC1 | ITU T1 | HKTA2015 | IN606049 | T1 |
| Hong Kong | Prosody X PCI with 2 DSPs and PMX/PMXC1 | ITU T1 | HKTA2015 | IN606048 | T1 |
| Hong Kong | Prosody X PCI with 4 DSPs and PMX/PMXC1 | ITU T1 | HKTA2015 | IN406047 | T1 |
| Hong Kong | E1/T1 PCI with PM1 | ITU T1 | HKTA2015 | IN403011 | T1 |
| Hong Kong | E1/T1 cPCI with PM1 | ITU T1 | HKTA2015 | IN603018 | T1 |
| India | Prosody X PCI | Q.931/Q.932 | TEC | TEC/NR/I/CTI-01/03/068.DEC07 | E1 |
| India | Prosody X PCIe | Q.931/Q.932 | TEC | TEC/NR/I/CTI-01/03/069.DEC07 | E1 |
| India | E1/T1 PCI with PM1 | Q.931/Q.932 | TEC | TEC/WR/I/CTI-01/02/052.SEP 04 | E1 |
| India | E1/T1 cPCI with PM1 | Q.931/Q.932 | TEC | TEC/WR/I/CTI-01/02/052.SEP 04 | E1 |
| Japan | Prosody X PCIe with DSP module1 | INS 1500 | Japan | T C 08-0002 205 | T1 |
| Japan | Prosody X PCI with PMXC 11 | INS 1500 | Japan | 07225004/AA/00 | T1 |
| Japan | Prosody X PCI with PMXC 21 | INS 1500 | Japan | 07225005/AA/00 | T1 |
| Japan | Prosody X PCI with PMXC 41 | INS 1500 | Japan | 07225006/AA/00 | T1 |
| Japan | Prosody X PCI with PMXC 81 | INS 1500 | Japan | 07225002/AA/00 | T1 |
| Japan | E1/T1 PCI with PM1 | INS 1500 | Japan | 04225006/AA/OO | T1 - fitted with DSP |
| Japan | Prosody PCI with PM1 | INS 1500 | Japan | 04225005/AA/OO | T1 - fitted with DSP |
| Korea | E1/T1 PCI with PM1 | Q.931/Q.932 | Korean requirements | TE-C99/K900-03-00093 | E1 |
| Korea | E1/T1 cPCI with PM1 | Q.931/Q.932 | Korean requirements | TE-C99/K900-03-0090 | E1 |
| Malaysia | Prosody X PCI with PMX/PMXC1 | Q.931/Q.932 | TPS-013-01 | CETS/394B/0506/T | E1 |
| Malaysia | E1/T1 PCI with PM1 | Q.931/Q.932 | TPS-013-01 | ISDA/48A/0603/S | E1 |
| Malaysia | E1/T1 cPCI with PM1 | Q.931/Q.932 | TPS-013-01 | Awaiting approval number | E1 |
| Mexico | E1/T1 PCI with PM1 | Q.931/Q.932 | Cofetel | RCPACAC04-712 | E1 |
| Mexico | E1/T1 cPCI with PM1 | Q.931/Q.932 | Cofetel | RCPACAC04-651 | E1 |
| New Zealand | Prosody X PCI with PMX/PMXC1 | Q.931/Q.932 | PTC 232 | PTC232/06/001 | E1 |
| New Zealand | E1/T1 PCI with PM1 | Q.931/Q.932 | PTC 232 | PTC220/02/029 | E1 |
| New Zealand | E1/T1 cPCI with PM1 | Q.931/Q.932 | PTC 232 | PTC220/02/030 | E1 |
| Singapore | Prosody X PCI with PMX/PMXC1 | Q.931/Q.932 | IDA TS ISDN-PRA | G0373-06 | E1 |
| Singapore | E1/T1 PCI with PM1 | Q.931/Q.932 | iDAS ISDN2 | ISDN2-0631-2003 | E1 |
| Singapore | E1/T1 cPCI with PM1 | Q.931/Q.932 | iDAS ISDN2 | ISDN2-0630-2003 | E1 |
| South Africa | Prosody X PCIe with 2 DSPs and 4 E1/T1 trunks | Q.931/Q.932 | TBR4 | TE-2008/109 | E1 |
| South Africa | Prosody X PCIe with 1 DSP and 2 E1/T1 trunks | Q.931/Q.932 | TBR4 | TE-2008/110 | E1 |
| South Africa | Prosody X E1/T1 PCIe with 4 E1/T1 trunks | Q.931/Q.932 | TBR4 | TE-2008/111 | E1 |
| South Africa | Prosody X PCI with PMX/PMXC1 | Q.931/Q.932 | TBR4 | SS-743.01 | E1 |
| South Africa | E1/T1 PCI with PM1 | Q.931/Q.932 | TBR4 | SS-425.01 | E1 |
| South Africa | Prosody PCI with PM1 | Q.931/Q.932 | TBR4 | SS-427.01 | E1 |
| South Africa | E1/T1 cPCI with PM1 | Q.931/Q.932 | TBR4 | SS-424.01 | E1 |
| South Africa | E1/T1 cPCI with PMXC 161 | Q.931/Q.932 | TBR4 | TE-2004/189 | E1 |
| South Africa | Prosody cPCI with PM1 | Q.931/Q.932 | TBR4 | SS-423.01 | E1 |
| Ukraine | Prosody PCI with 2 DSPs and PM1/2/4 | Euro ISDN | Ukraine | UA1 025.0132909-08 | E1 |
| Ukraine | Prosody X PCI with 1 DSP and PMX/PMXC | Euro ISDN | Ukraine | UA1 025.0132915-08 | E1 |
| Ukraine | Prosody X PCI with 2 DSP and PMX/PMXC | Euro ISDN | Ukraine | UA1 025.0132914-08 | E1 |
| Ukraine | Prosody X PCI with 4 DSP and PMX/PMXC | Euro ISDN | Ukraine | UA1 025.0132911-08 | E1 |
| USA | Prosody X PCI with PMX/PMXC1 | Aculab T1 protocols | FCC part 68 | 5TCXDNANPMXPCIX | T1 - fitted with DSP if applicable |
| USA | All PCI/cPCI cards with PM1 | Aculab T1 protocols | FCC part 68 | 5TCXDNANPM4MODT1 | T1 - fitted with DSP if applicable |
| USA | E1/T1 cPCI with PMXC 161 | Aculab T1 protocols | FCC part 68 | STCXDNAPMXT1MOD | T1 |
| Notes: 1. Protocols marked ' 2. Primary rate modules PM4/2/1 are used on E1/T1 PCI, and Passive monitor PCI boards. A PMX/PMXC module is used on Prosody X variants. A DSP 65 module is required for DTMF and CAS tone signalling (excluding Prosody X variants). View the product pages, contact your Account Manager or sales@aculab.com for details of configuration options available. 3. EU-wide member states include: Austria, Belgium, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, lithuania, Luxembourg, Malta, Poland, Portugal, Spain, Sweden, Slovakia, Slovenia, the Netherlands, United Kingdom (UK). Iceland, Norway and Switzerland have accepted EU telecommunications approvals although not member states. 4. All products are Safety and EMC approved. | |||||
| Country | Approved product | Approval standard | Approval number |
|---|---|---|---|
| China | Prosody X PCI | China Compulsory Certification | 2006021607000001 |
| E1/T1 PCI with PM | 2004011607105503 | ||
| Prosody PCI with PM | 2004011607105495 | ||
| IP telephony PCI with PM | 2004011608105501 | ||
| E1/T1 cPCI with PM | 2004011607105504 | ||
| Prosody cPCI with PM | 2004011607105497 | ||
| E1/T1 cPCI with PMXC 16 | 2005021607000001 |
| Country | Protocol | Protocol type | Additional notes | Aculab protocol stack | |
|---|---|---|---|---|---|
| Argentina | R2 CAS | CAS1 | R2T12 | ||
| Australia | TS014 | CCS | No longer supplied | AUSTEL-TS014 | |
| Australia | TS038 | CCS | ETS 300 | ||
| Australia | P2 | CAS1 | TS003/TPH1271/R2D | R2T12 | |
| Belgium | National R2 | CAS1 | R2T12 | ||
| Belgium | National R2 | DTMF CAS1 | BELGU | ||
| Brazil | Euro ISDN | CCS | ETS 300 | ||
| Brazil | MFC R2 | CAS1 | Brazil 5C | R2T12 | |
| Canada | T1 Robbed bit | CAS1 | T1RB | ||
| Chile | MFC R2 | CAS1 | R2T12 | ||
| China | R2 | CAS1 | China#1 | R2T12 | |
| China | Chinese ISDN | CCS | ETS300 | ||
| Colombia | R2 | CAS1 | R2T12 | ||
| Croatia | R2 | CAS1 | R2T12 | ||
| Czech Republic | R2 | CAS1 | R2T12 | ||
| Czech Republic | MFC R2 | CAS1 | Type K | R2T12 | |
| Denmark | National MFC R2 | CAS1 | R2DK | ||
| Egypt | MFC R2 | CAS1 | R2T12 | ||
| EU wide | Euro ISDN | CCS | ETS 300 | ||
| Finland | R2 | CAS1 | R2T12 | ||
| France | MF R1 Socotel | CAS1 | FMFS | ||
| France | VN3 | CCS | No longer supplied | VN3 | |
| France | VN6 | CCS | ETS 300 | ||
| Germany | 1tr6 | CCS | No longer supplied | 1tr6 | |
| Greece | OTE 4 | CAS1 | 4-bit CAS | OTE4 | |
| Greece | OTE 2 | CAS1 | 2-bit CAS | OTE2 | |
| Hong Kong | CR13 IDA-P | CCS | No longer supplied | ETS 300 | |
| Hong Kong | HKTA 2015 | CCS | ETS 300 | ||
| Hong Kong | HKT 2018 Robbed bit | CAS1 | T1HK; AMI or B8ZS encoding | T1HK | |
| India | MFC E&M | CAS1 | R2T12 | ||
| India | MFC R2 | CAS1 | Type 1/2/3 | R2T12 | |
| Indonesia | R2 (Q.421) | CAS1 | Ericsson loop signalling | R2T12 | |
| Indonesia | SMFC R2 | CAS1 | Semi-compelled | IEM | |
| Iran | R2 | CAS | 3-bit decadic | R2T12 | |
| Israel | ETS 300 | CCS | ETS 300 | ||
| Israel | MFC R2 | CAS1 | Israel R2 | R2T12 | |
| Italy | I701 | CAS1 | I701 | ||
| Japan | INS 1500 | CCS | INS1500 | ||
| Jordan | R2 | CAS1 | R2T12 | ||
| Korea | Euro ISDN | CCS | ETS 300 | ||
| Korea | R2 | CAS1 | R2T12 | ||
| Kuwait | R2 | CAS1 | R2T12 | ||
| Latvia | MFC R2 | CAS1 | R2T12 | ||
| Malaysia | MFC R2 | CAS1 | R2T12 | ||
| Malaysia | MFC R2 | CAS1 | IEM | ||
| Malta | MFC R2 | CAS1 | R2T12 | ||
| Mexico | R2 | CAS1 | R2T12 | ||
| Netherlands | ALS70D | CAS1 | T11-53E | ALSN/ALSU | |
| Netherlands | MFC R2 | CAS1 | R2T12 | ||
| New Zealand | TNA134 | CCS | Q.931 | ETS 300 | |
| Norway | National MFC R2 | CAS1 | R2T12 | ||
| Peru | MFC R2 | CAS1 | R2T12 | ||
| Philippines | R2 | CAS1 | R2T12 | ||
| Poland | EuroISDN | CCS | ETS 300 | ||
| Poland | MFC R2 | CAS1 | R2T12 | ||
| Portugal | MFC R2 | CAS1 | R2T12 | ||
| Sierra Leone | MFC R2 | CAS1 | R2T12 | ||
| Singapore | IDA TS ISDN2 | CCS | ETS 300 | ||
| Singapore | Fetex | CCS | FETEX | ||
| Singapore | MFC R2 | CAS1 | R2T12 | ||
| Singapore | MFC R2 | CAS1 | IEM | ||
| South Africa | Euro ISDN | CCS | ETS 300 | ||
| South Africa | MFC R2 | CAS1 | R2T12 | ||
| Spain | MF R1 Socotel | CAS1 | SMFS | ||
| Sweden | CAS extension EL7 | CAS1 | Ericsson ASB/voicemail | EL7 | |
| Sweden | P8 | CAS1 | P8 DDI and P7 non-DDI option | P8 | |
| Taiwan | MF R1 | CAS1 | Modified | T1RB | |
| thailand | National R2 DTMF | CAS1 | R2T12 | ||
| Turkey | R1 | CAS1 | E1LS | ||
| UK | DASS2 | CCS | DASS | ||
| UK | DPNSS | CCS | DPNSS | ||
| UK | BT/MCL Interconnect | CAS1 | Asymmetrical | BTMC | |
| UK | BT Callstream | CAS1 | SIN 205/356 | BTCU/BTCN | |
| UK | PD1 | CAS1 | MCL PD1/DC5A | PD1 | |
| USA | AT&T | CCS | tr41459 | ATT-T1 | |
| USA | DMS 100 | CCS | Nortel DMS (T1) | DMS100 | |
| USA | National ISDN 2 | CCS | NI1 and NI2 | NI2 | |
| USA | National ISDN2 | CCS | NFAS (with D-channel back-up) | NI2 | |
| USA | T1 robbed bit | CAS1 | T1RB | ||
| Worldwide (ex USA) | E1 line side CAS | CAS1 | AT&T Definity and Nortel Meridian | E1LS | |
| Worldwide | MFC R2 | CAS1 | Q.421/Q.441 | R2T12 | |
| Worldwide | SS5 | CAS1 | CCITT SS5 (C5) | SS5 | |
| Worldwide | Decadic CAS | CAS | Generic use with PBXs | R2T12 | |
| Worldwide | E&M type A | CAS1 | Ericsson DC5 and E&M options | EEMA | |
| Worldwide | 30Dli | CAS1 | NEC PA-30DTS | 30Dli | |
| Worldwide | SS7 | CCS | ITU-T: ISUP Q.767; TCAP Q.771-Q.774; SCCP Q.711- Q.714; MTP Q.703, Q.704, Q.707 | ISUP/TCAP | |
| Worldwide | Q.SIG | CCS | QSIG | ||
| Notes: 1. A DSP 65 module is required for DTMF or CAS tone signalling with E1/T1 PCI and Passive monitor PCI boards. A PMXC is needed for SS7 and DTMF or CAS tone signalling with Prosody X variants. 2. Protocols marked ' 3. Aculab's R2T1 firmware provides a generic MFC R2 protocol stack, which uses switches to establish specific national or signalling variants. See the individual protocol release notes available via the Aculab installation tool (AIT). 4. Many CAS protocols provide for selection of either decadic (dial pulse), DTMF or MFR1 or MFC R2 register signalling and a number of line signalling methods. See the individual protocol release notes. 5. the majority of protocols are balanced, meaning that the same protocol may be used at both user and network ends of a link. In some cases user and network ends are established by switches in the firmware. Some protocols are provided by means of separate firmware for user and network ends. See the individual protocol release notes. 6. Some protocols offer both DDI and non-DDI options. See the individual protocol release notes. 7. In some cases the source specification documentation is less than thorough in its treatment of the protocol, leaving operations open to interpretation. Aculab is grateful for any feedback regarding the use of any listed protocol. 8. If you cannot find the protocol you need listed here, we may be able to help, as often, particularly with CAS protocols, an existing variant can prove viable. Aculab's generic MFC R2 stack often proves suitable for use even in countries where it has not already been validated for use against a specification. Aculab are able to compare an existing protocol stack against your specification, or alternatively may be able to produce the required variant for you. Please contact your Account Manager or email sales@aculab.com to discuss your requirements. 9. Developers looking to use 'host independent' approved Aculab products in their complete CT systems should not require further telecoms approval for that system prior to network connection. | |||||
