《PHP实战:PHP中的socket_read和socket_recv区别详解》要点:
本文介绍了PHP实战:PHP中的socket_read和socket_recv区别详解,希望对您有用。如果有疑问,可以联系我们。
前几天用PHP写一个socket网络服务,在文档里看到socket_read和socket_recv这两个办法时有点晕,乍一看这不是一样的嘛,干吗还要给两个不同的用法呢.看文档没看太明白,看了下源码才搞清楚,在这里记录一下.PHP应用
先看一下这两个函数的声明:
PHP应用
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rzll", &php_sock_res, &buf, &len, &flags) == FAILURE) {
return;
}PHP应用
ZEND_FETCH_RESOURCE(php_sock, php_socket *, &php_sock_res, -1, le_socket_name, le_socket);PHP应用
/* overflow check */
if ((len + 1) < 2) {
RETURN_FALSE;
}PHP应用
recv_buf = emalloc(len + 1);
memset(recv_buf, 0, len + 1);PHP应用
if ((retval = recv(php_sock->bsd_socket, recv_buf, len, flags)) < 1) {
efree(recv_buf);PHP应用
zval_dtor(buf);
Z_TYPE_P(buf) = IS_NULL;
} else {
recv_buf[retval] = '\0';PHP应用
/* Rebuild buffer zval */
zval_dtor(buf);PHP应用
Z_STRVAL_P(buf) = recv_buf;
Z_STRLEN_P(buf) = retval;
Z_TYPE_P(buf) = IS_STRING;
}PHP应用
if (retval == -1) {
PHP_SOCKET_ERROR(php_sock, "unable to read from socket", errno);
RETURN_FALSE;
}PHP应用
RETURN_LONG(retval);
}
PHP应用
乱淮蠖眩涫涤幸恍凶罟丶
PHP应用
if (no_read > 200) {
set_errno(ECONNRESET);
return -1;
}
}PHP应用
if (n < maxlen) {
m = recv(sock->bsd_socket, (void *) t, 1, flags);
}PHP应用
if (errno != 0 && errno != ESPIPE && errno != EAGAIN) {
return -1;
}PHP应用
set_errno(0);
}
PHP应用
虽然这两个函数比拟混乱,但是看到这里应该明白了吧!好了睡觉去啦!PHP应用
维易PHP培训学院每天发布《PHP实战:PHP中的socket_read和socket_recv区别详解》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。