我已经实现了套接字通信,如下所示:
套接字客户端将“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/