在下面的代码中,我正在进行发送(23个字节),然后在无限循环中执行recv,只要数据准备就绪(根据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,'\0',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: %d\n",errno) ;
return ;
}
else if(rc == 0)
{
cout << "The other side closed the connection. \n" << endl ;
}
}
.....
有关为何发生这种情况的任何想法?
答案 0 :(得分:0)
在已注释的部分
rc = recv(m_sockfd, reply, 256, 0) ;
并在选择中
if((rc = recv(m_sockfd, reply, sizeof(reply), 0)) == -1)
不确定重放的定义是否与recv的功能相同,或者您将其作为参数传递。尝试在调用之前打印sizeof(重放),看看实际上是256。
答案 1 :(得分:-2)
一旦 select()通知您可用的数据,您必须调用 accept(),然后确定一个新套接字以实际读取该数据。
因此,您可以将 select()视为“耳塞”。一旦“耳朵”听到某些东西,它就会创建另一个专门用于在您和“听到的”远程方之间发送 - 接收TCP流的套接字。一旦远程方不再可用,您必须关闭该套接字。同时,“ear”套接字仍然存在,直到您对传入的连接请求感兴趣为止。