Table des matières
PHP中的socket_read和socket_recv区别详解,socketreadrecv
Maison développement back-end tutoriel php PHP中的socket_read和socket_recv区别详解,socketreadrecv_PHP教程

PHP中的socket_read和socket_recv区别详解,socketreadrecv_PHP教程

Jul 13, 2016 am 10:07 AM
php read recv socket 区别

PHP中的socket_read和socket_recv区别详解,socketreadrecv

前几天用PHP写一个socket网络服务,在文档里看到socket_read和socket_recv这两个方法时有点晕,乍一看这不是一样的嘛,干吗还要给两个不同的用法呢。看文档没看太明白,看了下源码才搞清楚,在这里记录一下。

先看一下这两个函数的声明:

复制代码 代码如下:

string socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
int socket_recv ( resource $socket , string &$buf , int $len , int $flags )

可以看到,从声明可以看到,一个是把收到的数据通过执行结果返回,另一个是把收到的数据通过引用的形式返回。另一个区别就是,socket_read多了一个type,socket_recv多了一个flags(够混乱的)。我们先来看看socket_recv的源码吧!
复制代码 代码如下:

PHP_FUNCTION(socket_recv)
{
    zval        *php_sock_res, *buf;
    char        *recv_buf;
    php_socket  *php_sock;
    int         retval;
    long        len, flags;

    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)         RETURN_FALSE;
    }

    recv_buf = emalloc(len + 1);
    memset(recv_buf, 0, len + 1);

    if ((retval = recv(php_sock->bsd_socket, recv_buf, len, flags))         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 ((retval = recv(php_sock->bsd_socket, recv_buf, len, flags))

可以看到,实际上这个函数就是调用了系统的recv而已,只是把输入参数和得到的结果都处理了一下,比较好理解。那我们再来看下socket_read,socket_read比系统的recv函数多了一个$type参数,这也是我认为这个函数存在的意义,从文档里可以看到,type有两个值,分别是PHP_BINARY_READ和PHP_NORMAL_READ,文档里有写,PHP_BINARY_READ表示直接用系统的recv方法,PHP_NORMAL_READ表示会一读,直到遇到\n 或者 \r,我们来看下源码:
复制代码 代码如下:

//省略一大堆
if (type == PHP_NORMAL_READ) {
    retval = php_read(php_sock, tmpbuf, length, 0);
} else {
    retval = recv(php_sock->bsd_socket, tmpbuf, length, 0);
}

可以看到,如果是PHP_NORMAL_READ模式,其实行为和socket_recv是一样的,都是用的系统的recv函数,但是如果是PHP_NORMAL_READ,则有很大区别,用了自己实现的php_read函数,那这个php_read是干啥的呢?我们继续看源码:
复制代码 代码如下:

*t = '\0';
while (*t != '\n' && *t != '\r' && n     if (m > 0) {
        t++;
        n++;
    } else if (m == 0) {
        no_read++;
        if (nonblock && no_read >= 2) {
            return n;
            /* The first pass, m always is 0, so no_read becomes 1
             * in the first pass. no_read becomes 2 in the second pass,
             * and if this is nonblocking, we should return.. */
        }

        if (no_read > 200) {
            set_errno(ECONNRESET);
            return -1;
        }
    }

    if (n         m = recv(sock->bsd_socket, (void *) t, 1, flags);
    }

    if (errno != 0 && errno != ESPIPE && errno != EAGAIN) {
        return -1;
    }

    set_errno(0);
}


还是指copy了关键部分,可以看到,这里的实现是一直循环调用recv,直到遇到\r或者\n或者读的数据长度到了指定的maxlen。

虽然这两个函数比较混乱,但是看到这里应该明白了吧!好了睡觉去啦!

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/955403.htmlTechArticlePHP中的socket_read和socket_recv区别详解,socketreadrecv 前几天用PHP写一个socket网络服务,在文档里看到socket_read和socket_recv这两个方法时有点晕,...
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quel échange est Nexo? Quel échange est Nexo? Mar 05, 2025 pm 07:39 PM

Nexo: Non seulement c'est un échange de crypto-monnaie, mais aussi votre directeur financier numérique. Il permet aux utilisateurs d'obtenir des prêts en crypto-monnaie en tant que garantie et fournit des services pour gagner des intérêts. Alors que Nexo propose également des capacités d'achat, de vente et de rédemption de crypto-monnaie, son principal activité est la cryptographie. Cet article explorera le modèle d'exploitation et la sécurité de Nexo en profondeur pour fournir aux investisseurs une compréhension plus complète. Le modèle d'exploitation de Nexo a été fondé en 2018 et a son siège à Zug, en Suisse, et est un pionnier dans le domaine de la finance numérique. Il est différent des autres échanges centralisés et se concentre davantage sur la fourniture de services financiers complets. Les utilisateurs peuvent acheter, vendre, échanger des crypto-monnaies sans vendre des actifs et

La différence entre l'éther et le bitcoin quelle est la différence entre l'éther et le bitcoin La différence entre l'éther et le bitcoin quelle est la différence entre l'éther et le bitcoin Mar 19, 2025 pm 04:54 PM

La différence entre Ethereum et Bitcoin est significative. Techniquement, Bitcoin utilise POW et Ether est passé de Pow à Pos. La vitesse de trading est lente pour le bitcoin et Ethereum est rapide. Dans les scénarios d'application, Bitcoin se concentre sur le stockage des paiements, tandis que Ether prend en charge les contrats intelligents et les DAPP. En termes d'émission, le montant total du bitcoin est de 21 millions et il n'y a pas de montant total fixe de pièces d'éther. Chaque défi de sécurité est disponible. En termes de valeur marchande, le bitcoin se classe en premier et les fluctuations des prix des deux sont importantes, mais en raison de caractéristiques différentes, la tendance des prix d'Ethereum est unique.

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelle est la différence entre le pain aux haricots et la profondeur Quelle est la différence entre le pain aux haricots et la profondeur Mar 12, 2025 pm 01:24 PM

La différence de base entre le pain de haricot et Deepseek est la précision et la complexité de la récupération. 1. Doubao est basé sur la correspondance des mots clés, simple et directe, avec un faible coût, mais une faible précision, et ne convient que pour des données structurées; 2. Deepseek est basé sur l'apprentissage en profondeur, peut comprendre la sémantique, a une précision élevée, mais un coût élevé et convient aux données non structurées. Le choix final dépend du scénario d'application et des limitations de ressources.

La mentalité d'investissement en crypto est très importante! Comment éviter les inquiétudes inutiles et prendre les décisions correctes? La mentalité d'investissement en crypto est très importante! Comment éviter les inquiétudes inutiles et prendre les décisions correctes? Mar 05, 2025 pm 07:24 PM

Peur, incertitude et doute de l'investissement en crypto: comment prendre des décisions éclairées? De nombreux investisseurs de crypto sont confrontés à des craintes de «c'est le dernier cycle», ainsi que des préoccupations concernant la durée du marché haussier, associée à la pression des autres, ce qui conduit ensemble à de mauvaises décisions d'investissement. Cet article explorera comment surmonter ces défis et faire des choix d'investissement plus intelligents. Risque potentiel: distraction: chasser aveuglément les points chauds et ignorer la valeur des actifs centraux. Pessimisme et hésitation: L'incertitude conduit à un manque de confiance, à l'incapacité de tenir longtemps et même à la sortie du marché. Manque de croyance: manque de recherches approfondies sur les projets et ne peut pas faire face à la volatilité du marché. Manque de stratégies de bénéfice: nettoyer les positions tôt en raison de la peur des retraits, manquant des rendements potentiels. Stratégies d'adaptation: 1. Focus sur les zones centrales:

Introduction détaillée à l'heure d'ouverture et de clôture d'Ouyi Okex Introduction détaillée à l'heure d'ouverture et de clôture d'Ouyi Okex Mar 18, 2025 pm 01:06 PM

La plate-forme de trading d'actifs numériques OUYI OKEX est différente du marché traditionnel des valeurs mobilières. Cependant, la plate-forme annoncera à l'avance et ajustera temporairement les délais de négociation ou les règles en cas de mises à niveau de maintenance du système ou d'événements spéciaux sur le marché (tels que des conditions de marché extrêmes provoquant de graves fluctuations du marché), telles que la suspension de négociation ou de modification des règles d'ouverture de la position de trading de contrats. Par conséquent, il est recommandé que les utilisateurs accordent une attention particulière aux annonces de plate-forme et aux tendances du marché, saisissent les opportunités de négociation et font du bon travail dans la gestion des risques. Ce n'est qu'en comprenant que l'heure de négociation et les ajustements de règle d'Okex que vous pouvez être à l'aise sur le marché des montures numériques.

La différence entre le pain aux haricots et la profondeur La différence entre le pain aux haricots et la profondeur Mar 12, 2025 pm 01:57 PM

La principale différence entre Doubao et Deepseek est: 1. Doubao est un moteur de recherche de mots clés qui s'appuie sur la correspondance des mots clés; 2. La source des données de sacs de haricots est large mais la qualité est inégale. 3. Les résultats de BEAN BUN sont présentés sous forme de liste, et Deepseek peut fournir des réponses plus riches et des informations de contexte. 4. Les petits pains à bean sont faciles à utiliser et Deepseek peut nécessiter des instructions de requête plus complexes. Par conséquent, le pain aux haricots convient rapidement pour trouver rapidement des informations, tandis que Deepseek convient à la recherche sémantique approfondie et à l'exploration d'informations, et le choix dépend des besoins spécifiques.

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

See all articles