php的socket函数参考

CIC-IDS数据集特征介绍 ###1、简介 通信安全机构(CSE)与加拿大网络安全研究所(CIC)合作项目,该项目对自1998年以来现有的11个数据集的评估表明,大多数数据集(比如经典的KDDCUP99,NSLKDD等)已经过时且不可靠。其中一些数据集缺乏流量多样性和容量,一些数据集没有涵盖各种已知的攻击,而另一些数据集将数据包有效载荷数据匿名化,这不能反映当前的趋势。有些还缺少特征集和元数据。 CIC-IDS-2017数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs)。 它的数据采集截至2017... 阅读详情
这些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
  1. <?php
  2.     set_time_limit(0);
  3.     //create the socket
  4.     if(($socket = socket_create(AF_INET, SOCK_STREAM, 0)) < 0)
  5.     {
  6.         print("Couldn't create socket: " . socket_strerror(socket_last_error()) . "/n");
  7.     }
  8.  
  9.     //bind it to the given address and port
  10.     if(($error = socket_bind($socket, gethostbyname($_SERVER['HOSTNAME']), 12345)) < 0)
  11.     {
  12.         print("Couldn't bind socket: " . socket_strerror(socket_last_error()) . "/n");
  13.     }
  14.  
  15.     if(($error = socket_listen($socket, 5)) < 0)
  16.     {
  17.         print("Couldn't list on socket: " .
  18.             socket_strerror(socket_last_error()) . "/n");
  19.     }
  20.  
  21.     while(TRUE)
  22.     {
  23.         //wait for connection
  24.         if(($accept = socket_accept($socket)) < 0)
  25.         {
  26.             print("Error while reading: " . socket_strerror($message) . "/n");
  27.             break;
  28.         }
  29.  
  30.         //send welcome message
  31.         socket_write($accept, "Connection accepted/n");
  32.         print(date('Y-m-d H:i:s') . " STATUS: Connection accepted/n");
  33.         ob_flush();
  34.  
  35.         while(TRUE)
  36.         {
  37.             //read line from client
  38.             if(FALSE === ($line = socket_read($accept, 1024)))
  39.             {
  40.                 print("Couldn't read from socket: " .
  41.                     socket_strerror(socket_last_error()) . "/n");
  42.                 break 2;
  43.             }
  44.  
  45.             if(!@socket_write($accept, "ECHO$line"))
  46.             {
  47.                 print(date('Y-m-d H:i:s') . " STATUS: Connection interrupted/n");
  48.                 break;
  49.             }
  50.             print(date('Y-m-d H:i:s') . " READ$line");
  51.             ob_flush();
  52.         }
  53.  
  54.         socket_close($accept);
  55.     }
  56. ?>
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
  1. <?php
  2.     //create UDP socket
  3.     if(($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) < 0)
  4.     {
  5.         print("Couldn't create socket: " .
  6.             socket_strerror(socket_last_error()) . "/n");
  7.     }
  8.  
  9.     //timeout after 5 seconds
  10.     socket_set_option($socket, SOL_SOCKET,
  11.         SO_RCVTIMEO, array('sec'=>5,'usec'=>0));
  12.  
  13.     //connect to the RtCW master server
  14.     if(!socket_connect($socket, 'wolfmaster.idsoftware.com', 27950))
  15.     {
  16.         print("Couldn't connect: " .
  17.             socket_strerror(socket_last_error()) . "/n");
  18.     }
  19.  
  20.     //send request for servers
  21.     socket_write($socket, "/xFF/xFF/xFF/xFFgetservers/x00");
  22.  
  23.     //get servers
  24.     $server = array();
  25.     while(FALSE !== ($line = @socket_read($socket, 4096)))
  26.     {
  27.         //parse data
  28.         for($i=22; ($i+5) < strlen($line); $i += 7)
  29.         {
  30.             $ip = ord(substr($line, $i+1, 1)) . '.' .
  31.                 ord(substr($line, $i+2, 1)) . '.' .
  32.                 ord(substr($line, $i+3, 1)) . '.' .
  33.                 ord(substr($line, $i+4, 1));
  34.  
  35.             $port = (ord(substr($line, $i+5, 1)) * 256) +
  36.                 ord(substr($line, $i+6, 1));
  37.  
  38.             $server[] = array('ip'=>$ip, 'port'=>$port);
  39.         }
  40.     }
  41.  
  42.     print("<h1>" . count($server) . " Servers</h1>/n");
  43.  
  44.     //loop over servers, getting status
  45.     foreach($server as $s)
  46.     {
  47.         print("<h1>{$s['ip']}:{$s['port']}</h1>/n");
  48.  
  49.         //connect to RtCW server
  50.         if(!socket_connect($socket, $s['ip'], $s['port']))
  51.         {
  52.             print("<p>/n" .
  53.                 socket_strerror(socket_last_error()) .
  54.                 "/n</p>/n");
  55.             continue;
  56.         }
  57.  
  58.         //send request for status
  59.         socket_write($socket, "/xFF/xFF/xFF/xFFgetstatus/x00");
  60.  
  61.         //get status from server
  62.         if(FALSE === ($line = @socket_read($socket, 1024)))
  63.         {
  64.             print("<p>/n" .
  65.                 socket_strerror(socket_last_error()) .
  66.                 "/n</p>/n");
  67.             continue;
  68.         }
  69.  
  70.         $part = explode("/n", $line);
  71.  
  72.         //settings are in second line separated by backslashes
  73.         $setting = explode("//", $part[1]);
  74.  
  75.         print("<h2>Configuration</h2>/n");
  76.         print("<p>/n");
  77.         for($s=1; $s < count($setting); $s += 2)
  78.         {
  79.             print("/t/t{$setting[$s]} = {$setting[$s+1]}<br>/n");
  80.         }
  81.         print("</p>/n");
  82.         print("<h2>Players</h2>/n");
  83.         $lastPlayer = count($part) - 1;
  84.         for($p=2; $p < $lastPlayer; $p++)
  85.         {
  86.             $player = explode(" ", $part[$p]);
  87.             print("{$player[2]} Score={$player[0]} " .
  88.                 "Ping={$player[1]}<br>/n");
  89.         }
  90.         print("</p>/n");
  91.         ob_flush();
  92.     }
  93.     print("</table>/n");
  94.  
  95.     socket_close($socket);
  96. ?>
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
  1. <?php
  2.     if(!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $socket))
  3.     {
  4.         print("Couldn't make sockets!/n");
  5.         exit();
  6.     }
  7.  
  8.     $child = pcntl_fork();
  9.     if($child == -1)
  10.     {
  11.         print("Couldn't fork!/n");
  12.         exit();
  13.     }
  14.     elseif($child > 0)
  15.     {
  16.         //parent
  17.         socket_close($socket[0]);
  18.         print("Parent: waiting for message/n");
  19.         $message = socket_read($socket[1], 1024, PHP_NORMAL_READ);
  20.         print("Parentgot message--$message/n");
  21.         socket_write($socket[1], "Hello, Child Process!/n");
  22.         pcntl_waitpid($child, $status);
  23.     }
  24.     else
  25.     {
  26.         //child
  27.         socket_close($socket[1]);
  28.         socket_write($socket[0], "Hello, Parent Process!/n");
  29.         print("Child: waiting for message/n");
  30.         $message = socket_read($socket[0], 1024, PHP_NORMAL_READ);
  31.         print("Childgot message--$message/n");
  32.         exit(0);
  33.     }
  34. ?>
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
  1. <?php
  2.     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  3.  
  4.     print('SO_BROADCAST: ' .
  5.         socket_get_option($socket, SOL_SOCKET,
  6.             SO_BROADCAST) . "<br>/n");
  7.     print('SO_DEBUG: ' .
  8.         socket_get_option($socket, SOL_SOCKET,
  9.             SO_DEBUG) . "<br>/n");
  10.     print('SO_DONTROUTE: ' .
  11.         socket_get_option($socket, SOL_SOCKET,
  12.             SO_DONTROUTE) . "<br>/n");
  13.     print('SO_ERROR: ' .
  14.         socket_get_option($socket, SOL_SOCKET,
  15.             SO_ERROR) . "<br>/n");
  16.     print('SO_KEEPALIVE: ' .
  17.         socket_get_option($socket, SOL_SOCKET,
  18.             SO_KEEPALIVE) . "<br>/n");
  19.     print('SO_LINGER: ' .
  20.         print_r(socket_get_option($socket, SOL_SOCKET,
  21.             SO_LINGER), TRUE) . "<br>/n");
  22.     print('SO_OOBINLINE: ' .
  23.         socket_get_option($socket, SOL_SOCKET,
  24.             SO_OOBINLINE) . "<br>/n");
  25.     print('SO_RCVBUF: ' .
  26.         socket_get_option($socket, SOL_SOCKET,
  27.             SO_RCVBUF) . "<br>/n");
  28.     print('SO_RCVLOWAT: ' .
  29.         socket_get_option($socket, SOL_SOCKET,
  30.             SO_RCVLOWAT) . "<br>/n");
  31.     print('SO_RCVTIMEO: ' .
  32.         print_r(socket_get_option($socket, SOL_SOCKET,
  33.             SO_RCVTIMEO), TRUE) . "<br>/n");
  34.     print('SO_REUSEADDR: ' .
  35.         socket_get_option($socket, SOL_SOCKET,
  36.             SO_REUSEADDR) . "<br>/n");
  37.     print('SO_SNDBUF: ' .
  38.         socket_get_option($socket, SOL_SOCKET,
  39.             SO_SNDBUF) . "<br>/n");
  40.     print('SO_SNDLOWAT: ' .
  41.         socket_get_option($socket, SOL_SOCKET,
  42.             SO_SNDLOWAT) . "<br>/n");
  43.     print('SO_SNDTIMEO: ' .
  44.         print_r(socket_get_option($socket, SOL_SOCKET,
  45.             SO_SNDTIMEO), TRUE) . "<br>/n");
  46.     print('SO_TYPE: ' .
  47.         socket_get_option($socket, SOL_SOCKET,
  48.             SO_TYPE) . "<br>/n");
  49. ?>
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中。
从零到一:基于DESeq2的转录组差异表达分析实战指南 本文详细介绍了基于DESeq2的转录组差异表达分析实战指南,涵盖数据准备、标准化处理、差异分析及结果解读等关键步骤。DESeq2凭借其稳定性和对低表达基因的友好处理,成为转录组数据分析的首选工具。文章还提供了常见问题排查和优化建议,帮助研究者高效完成从分析到发表的完整流程。 阅读详情

相关推荐

零基础实战:用 Docker 和 vLLM 本地部署 BGE-M3 文本嵌入模型

BGE-M3是北京智源推出的多功能文本嵌入模型,支持跨语言语义匹配。利用Docker容器化和vLLM框架可高效部署该模型,实现本地运行的优势包括隐私保护、定制化和成本控制。通过配置Docker环境,使用vLLM官方镜像加载模型,并进行文本嵌入测试验证效果。该方案适合开发者快速验证模型能力,或集成到本地NLP流程中。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 4895

[翻译] PHPSocket函数参考

[翻译] PHPSocket函数参考文章:     Sockets书名:   《Core PHP Programming》Third Edition翻译:     heiyeluren 这些Socket函数直接跟互联网的协议进行发送信息。相对于fopensock的流来讲,他们操作在一个比较底层的级别。通常,他们都是对C函数进行封装,并且名称都类似。如果你有使用C进行socket编程的经验,那么使

heiyeluren的blog(黑夜路人的开源世界) 4489

Python爬虫实战:基于最新技术爬取国家企业信用信息公示系统数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的国家企业信用信息公示系统爬虫。我们将从爬虫基础知识讲起,逐步深入到反爬机制应对、数据解析与存储等高级话题,最终实现一个完整的爬虫系统。文章包含大量实战代码示例,适合中高级Python开发者学习参考。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和商业情报收集等领域。通用爬虫:如搜索引擎爬虫,广泛抓取互联网公开信息聚焦爬虫:针对特定领域或网站的数据采集增量式爬虫:只抓取更新内容,减少资源消耗。

2201_76125261的博客 2356

PHP原生socket详解

PHP原生WebSocket服务 来源 https://www.cnblogs.com/loveyoume/p/6076101.html https://blog.csdn.net/weixin_42133420/article/details/80444661 https://blog....

chuanguan1820的博客 1306

[socket.io]io.sockets.socket.get(socketId)根据id 获取当前socket 

socket.to(SocketId).emit();也是可以解决的,参考文档如下。但是我在官方找不到get这个方式, 于是照了很久,终于找到外国人的讨论。是这样的, 想搞一个一对一聊天, 因为刚接触ws,不懂, 看到老师用。获取到那个socket,然后再emit.例如这样。房间 | Socket.IO。

Madman528的博客 1054

C/C++之readv/writev

writev/readv

dddgggd的博客 1274

php判断socket,PHP测试socket连接

1. 创建PHP文件, test.phpfunction printLog($log){echo '[' . date('Y-m-d H:i:s', time()) . '] - ' . $log . "\n";}$tcpClient = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);socket_set_option($tcpClient, SOL_S...

weixin_42493060的博客 511

PHPSocket函数参考

<br />PHPSocket函数参考<br /><br /><br />  这些Socket函数直接跟互联网的协议进行发送信息。相对于fopensock的流来讲,他们操作在一个比较底层的级别。通常,他们都是对C函数进行封装,并且名称都类似。<br />  如果你有使用C进行socket编程的经验,那么使用这些函数将是非常熟练的。我们这里不讨论特别详细的socket编程。 使用这些函数能够解决高层级别函数所不能解决的难题。使用这些函数能够实现类似fopen的功能,你也许有很多方法来实现socket的功

刘阳龙Herman的专栏 850

c++ 网络编程(五) LINUX下 socket编程 多种I/O函数 -以及readv和writev函数用法

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614056.html 一.多种I/O函数 前言:之前我们讲的数据传输一般Linux上用write和read,Windows上用send和recv。其实Linux上也可以用send和recv,它与write和read主要区别是它的最后一个参数可以附带一些...

weixin_34377919的博客 347

socket send函数系列,彻底弄懂socket发送函数,可做参考手册

套接字发送函数系列,全面比较socket编程所有发送函数,通过对比学习方式,让初学者彻底理解socket发送函数作用。

weixin_28673511的博客 5060

Linux Socket常用读写函数

Linux Socket常用读写函数

weixin_44178960的博客 482

TCP Socket性能优化秘籍:掌握read、recv、readv、write、send、sendv的最佳实践

合理选择 TCP Socket 的选项和参数:如 SO_REUSEADDR、SO_KEEPALIVE、TCP_NODELAY、TCP_QUICKACK 等选项和参数,根据具体情况进行设置,以优化 TCP Socket 的性能和行为。因此,在进行测量和对比时,应尽量在相同的环境和条件下进行,并考虑到可能的干扰因素。根据服务器的负载情况,合理调整 TCP Socket 的选项和参数,如 SO_REUSEADDR、SO_KEEPALIVE、TCP_NODELAY、TCP_QUICKACK 等,以优化性能和行为。

木牛的博客 1325

PHP Socket基础知识

◇ Socket基础 ◇ 产生一个服务器 ◇  产生一个客户端 在这一章里你将了解到迷人而又让人容易糊涂的套接字(Sockets)。SocketsPHP中是没有充分利用的功能。今天你将看到产生一个能使用客户端连接的服务器,并在客户端使用socket进行连接,服务器端将详细

tianmo2010的专栏 2105

php socket输出16,PHP 通过Socket收发十六进制数据的简单示例

这篇文章主要为大家详细介绍了PHP 通过Socket收发十六进制数据的简单示例,具有一定的参考价值,可以用来参考一下。感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!最近在php下做关于Socket通讯的相关内容,发现网络上好多人在了解如何进行16进制收发,研究了下,代码如下,欢迎拍砖。代码如下:/* 512笔记 www.512Pic.com */$sendStr = '30 32 ...

weixin_35715366的博客 323

php socket read超时,[转]socket超时设置详解(connect/read/write)

https://blog.csdn.net/gettogetto/article/details/77105005一.基本概念(摘自:《unix网络编程》卷114.2 套接字超时)在涉及套接字的I/O操作上设置超时的方法有以下三种(1)调用alarm,它在指定超时期满时产生SIGALARM。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。(2)在s...

weixin_33828635的博客 1021

socke tcp 阻塞 非阻塞 read、write、write、writev、send、sendto、sendmsg

linux socket read 阻塞 read函数只是一个通用的读文件设备的接口。是否阻塞需要由设备的属性和设定所决定。一般来说,读字 符终端、网络的socket描述字,管道文件等,这些文件的缺省read都是阻塞的方式。如果是读磁盘上的文件,一般不会是阻塞方式的。但使用锁和 fcntl设置取消文件O_NOBLOCK状态,也会产生阻塞的read效果。 怎么样以非阻塞的方式从管道中读取数据?

不枉少年 4974

存储课程学习笔记6_io接口练习(readv,writev, 借助本地socket实现进程间(sendmsg,recvmsg)通过共享内存数据交互)

1:主要练习sendv和readv函数接口, 构造struct iovec结构体发送或者接收不连续内存的处理。2:练习AF_UNIX 进行原生socket的通信。3:基于socket通信的基础上,创建共享内存,多个进程之间实现交互(shm_open, mmap)4:多个进程之间使用共享资源(这里共享内存),需要考虑互斥。

yun6853992的博客 892

Linux socket 数据发送类函数实现(二)

write()函数 函数原型 ssize_t write(int fd, const void *buf, size_t count); 其中, fd为文件描述符,在socket编程中即为socket或者accept系统调用返回的网络文件描述符; buf是用户数据存储起始地址; count为用户数据长度。 内核实现 SYSCALL_DEFINE3(write, un...

Blue summer的博客 1096

Linux Socket---write/send/sendto/wirev/sendmsg

首先,我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构;在我们的虚拟机上发送icmp回显请求包,ping另一台主机192.168.1.111。我们使用系统调用sendto发送这个icmp包。 ssize_t sendto(int s, const void *buf, size_t len, int flags, ...

迷失的专栏 1747

php socket通信编程中的几个常见问题:只能发送一次,不能主动下发,发送完就断开,socket长连接问题,与socket阻塞

php socket编程中,因为tcp通信和web服务通信上的一定差别,就会出现标题中常见的几个问题:只能发送一次,不能主动下发,发送完就断开,socket长连接问题,与socket阻塞。 首先我们贴一段完整的接收发送消息的socket php长连接代码: <?php set_time_limit(0); ob_implicit_flush(); //创建服...

Robb 2088

元胞自动机 .zip

元胞自动机

JDI 2.56 LCD寸屏幕规格书-VR

JDI2.56寸2160*2160VR头戴显示虚拟应液晶屏高亮八角;JDI 型号:LPM026M648A 种类:TFT型液晶屏(模块) 屏幕尺寸:2.56 分辨率:2160 × 3 (R,G,B) (W) × 2160 (H) dots 触摸功能:无触摸功能 应用领域:VR

上一篇: 让php支持端点续传
下一篇: PHP的curl_setopt
lucklrj
博客等级 码龄21年 5粉丝 19原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值