前几天用php写一个socket网络服务,在文档里看到socket_read和socket_recv这两个方法时有点晕,乍一看这不是一样的嘛,干吗还要给两个不同的用法呢。看文档没看太明白,看了下源码才搞清楚,在这里记录一下。
先看一下这两个函数的声明:
if (zend_parse_parameters(zend_num_args() tsrmls_cc, "rzll", &php_sock_res, &buf, &len, &flags) == failure) {
return;
}
zend_fetch_resource(php_sock, php_socket *, &php_sock_res, -1, le_socket_name, le_socket);
/* overflow check */
if ((len + 1) < 2) {
return_false;
}
recv_buf = emalloc(len + 1);
memset(recv_buf, 0, len + 1);
if ((retval = recv(php_sock->bsd_socket, recv_buf, len, flags)) < 1) {
efree(recv_buf);
zval_dtor(buf);
z_type_p(buf) = is_null;
} else {
recv_buf[retval] = '\0';
/* rebuild buffer zval */
zval_dtor(buf);
z_strval_p(buf) = recv_buf;
z_strlen_p(buf) = retval;
z_type_p(buf) = is_string;
}
if (retval == -1) {
php_socket_error(php_sock, "unable to read from socket", errno);
return_false;
}
return_long(retval);
}
啰里啰嗦一大堆,其实有一行最关键:
if (no_read > 200) {
set_errno(econnreset);
return -1;
}
}
if (n < maxlen) {
m = recv(sock->bsd_socket, (void *) t, 1, flags);
}
if (errno != 0 && errno != espipe && errno != eagain) {
return -1;
}
set_errno(0);
}
虽然这两个函数比较混乱,但是看到这里应该明白了吧!好了睡觉去啦!
如对本文有疑问, 点击进行留言回复!!
[ACTF2020 新生赛]Include 1【文件包含】【读取代码】
算法题解 - 牛客编程巅峰赛S1第6场 - 黄金&钻石&王者组
推荐一个程序员必备网站之一:Dev Hints ,非常实用!
网友评论