《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全面培養人才。