我已经实现了套接字通信,如下所示:

套接字客户端将“0010ABCDEFGHIJ”发送到套接字服务器,
前4个字节(在本例中为“0010”)描述了邮件正文有10个字节,
然后跟随的那些字节是消息正文!

我在服务器端使用了“Linux编程接口(interface)” readn函数,
来源 :

ssize_t
readnx(int fd, void *buffer, size_t n)
{
    ssize_t numRead;                    /* # of bytes fetched by last read() */
    size_t totRead;                     /* Total # of bytes read so far */
    char *buf;

    buf = (char*) buffer;               /* No pointer arithmetic on "void *" */
    for (totRead = 0; totRead < n; ) {
        numRead = recv(fd, buf, n - totRead,MSG_NOSIGNAL);

        if (numRead == 0)               /* EOF */
            return totRead;             /* May be 0 if this is first read() */
        if (numRead == -1) {
            if (errno == EINTR)
                continue;               /* Interrupted --> restart read() */
            else
                return -1;              /* Some other error */
        }
        totRead += numRead;
        buf += numRead;
    }
    return totRead;                     /* Must be 'n' bytes if we get here */
}


void *thread1(void *param)
{
    int nread = 0  ;
    char strdata[1024]={0},strtmp[128]={0} ;
    pthread_detach(pthread_self());
    while(1)
    {
        memset(strtmp,0x00,sizeof(strtmp)) ;
        if ( (nread = readnx(sd,strtmp,4)) <=  0){
            break ;
        }
        int ilen = atoi(strtmp) ;
        memset( strdata,0x00,sizeof(strdata) ) ;
        if ( (nread = readnx(sd,strdata,ilen)) <= 0){
            break ;
        }
    }//while
}

这对我来说效果很好,我想了解有关效果的更多详细信息,
我的源代码中有2个readnx函数调用,并且在
阻止模式,如果我更改代码以首先使用MSG_PEEK进行recv,
一旦所有14个字节都可用,则一次调用readnx以获取所有数据,
它会比我原来的2个readnx调用快吗?

我想知道在我的原始资料中,我有2个readnx可以接收“0010”
和“ABCDEFGHIJ”分开,这会导致linux内核复制到
用户空间的两倍,甚至所有14个字节在我当时都已经存在
叫做first readnx?!或者内核将所有14个字节复制到用户空间
只是一次,readnx函数只是从用户空间读取它?

如果我想了解有关内核到用户空间过程的那些细节,
什么文件,函数调用可以帮助我详细了解。

最佳答案



这意味着您要休眠并重试。你要睡多久?您如何知道零件到达的时间间隔有多远?



不。与recv()不同,您不会在正确的时间内休眠,并且您所做的可能不止一个MSG_PEEK。

如果您担心两个recv()调用的性能,或者它需要花费多少,您应该在发送方尽最大努力确保 header 和消息同时发送:看看sendmsg()

关于c - 在c中recv的性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36439240/

10-09 13:23