TCP Recv使用select()返回1字节读取
TCP Recv using select() returning 1 byte reads
在下面的代码中,我正在进行发送(23字节),然后在无限while循环中,每当数据准备好时(根据select调用的返回)就进行接收。问题是,我似乎总是最终从recv()读取1字节。我知道TCP是面向流的,并且不能保证我将返回多大的大小,但是如果我启用下面禁用的代码(即。在while循环中无限地执行recv) -我似乎总是读取29字节(我期望的)。然而,如果我使用select函数调用,recv在每次迭代中只读取1个字节。它会一直这样做(可能在它读完所有数据的时候)。
int rc = 0, numBytes=0 ;
char reply[256] ;
// Send a ping
char PingPacket[23] ;
PreparePingPacket(PingPacket) ;
numBytes = send(m_sockfd,PingPacket,23,0);
/*----- COMMENTED OUT
while(1){
rc = recv(m_sockfd, reply, 256, 0) ;
if(rc == -1)
{
fprintf(stderr, "Error on Sending Ping .. n") ;
return ;
}else{
ParsePacket(reply, rc) ;
}
}
*/ END OF COMMENTED PART
// Now wait for all types of pongs to come back
fd_set rfs ;
while(1)
{
memset(reply,' ',256) ;
FD_ZERO(&rfs) ;
FD_SET(m_sockfd,&rfs) ;
// Wait for ever ..
if((rc = select(m_sockfd+1, &rfs, NULL, NULL, NULL)) < 0)
{
fprintf(stderr, "Select Error after connection .. n") ;
close(m_sockfd) ;
return ;
}
if(FD_ISSET(m_sockfd, &rfs))
{
cout << "Read. for reading" << endl ;
int rc = 0 ;
if((rc = recv(m_sockfd, reply, sizeof(reply), 0)) == -1)
{
cout << "Could not read anything .... " << endl ;
fprintf(stderr,"Error: %dn",errno) ;
return ;
}
else if(rc == 0)
{
cout << "The other side closed the connection. n" << endl ;
}
}
.....
你知道为什么会这样吗?
在注释掉的部分有
rc = recv(m_sockfd, reply, 256, 0) ;
在select中有
if((rc = recv(m_sockfd, reply, sizeof(reply), 0)) == -1)
不确定replay的定义是否与recv的定义相同,或者您将其作为参数传递。尝试在调用之前打印sizeof(replay),看看它实际上是256。
一旦select()通知您可用的数据,您必须调用accept(),然后确定一个新的套接字来实际读取该数据。
因此,您可以将select()视为"耳槽"。一旦"耳朵"听到了什么,它就会创建另一个套接字,专门用于在您和"听到"的远程方之间发送-接收TCP流。一旦远程方不再可用,您必须关闭该套接字。同时,"ear"套接字会一直存在,直到您对服务传入的连接请求感兴趣为止。相关文章:
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- C++/CX 如何从 IRandomAccessStream^ 转换为字节并返回.(UWP)
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- C++ 从函数返回无符号字节
- 裸__declspec上的 memcpy 返回意外的字节
- InternetReadFile 填充缓冲区,但返回零字节读取
- 如果send()返回x字节,则recv()在一个呼叫中获取相同数量的字节
- ::运算符 delete(指针) 返回释放的字节大小
- 函数返回的 gsl::span 具有错误的字节
- 如何迫使新操作员返回的指针将是32字节对齐
- 返回字节数组或将数组传递到函数中
- crypto++将密钥保存到字节队列并返回到密钥
- mbtowc在osx上总是返回一个字节
- C 我应该如何返回字节数组
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 如果在 main 中使用字符串,为什么 CRT 会返回 8 字节泄漏
- TCP Recv使用select()返回1字节读取
- 如何在Crypto++中返回字节值
- Microsoft psapi方法是否使用十进制或二进制表示法返回字节?
- 函数接受两个参数,一个字节和一个位字段,并返回字节中字段的值