1

我正在尝试创建与我提供的服务器/端口的连接 - 建立连接后,我能够向它发送 ping 数据包(至少我认为我能够,因为 send() 似乎返回了正确的字节数),但是当我立即尝试 recv() 时,调用失败说

"Error on Receiving .. Connection Refused"  

关于为什么 send 不会出错,但 recv 会出错的任何想法?以下是导致我失败的代码部分 - 它在它自己的线程上运行。TCP 连接是在另一个线程上建立的,并且那个套接字描述符被传递给这个线程(它在下面称为 m_sockfd)。

void ConnectionManager::operator()()
{

  int rc = 0, numBytes=0 ; 
  char reply[256] ; 

  // Send a ping
  char PingPacket[23] ; 
  PreparePingPacket(PingPacket) ; 
  numBytes = send(m_sockfd,PingPacket,23,0); 
  if(numBytes == -1)
  {
    fprintf(stderr, "Error on Sending Ping .. \n") ;   
    return ; 
  }
  if(numBytes < 23)
  {
    fprintf(stderr, "Didn't send the whole Ping Request .. %d \n", numBytes) ;  
  }

  numBytes = recv(m_sockfd, reply, 256, 0) ; 

  if(numBytes == -1)
  {
    fprintf(stderr, "Error on Receiving .. %s \n", strerror(errno)) ;   
    return ; 
  }

  ParsePacket(reply, rc) ; 
}

我可以粘贴进行实际连接的代码,但我想如果它有错误,那么发送将永远不会通过?

感谢阅读 - 任何帮助表示赞赏!

4

1 回答 1

1

想通了 - 从我这边看,这是非常愚蠢的事情。问题出在我的 getaddrinfo() 语句上。在将其设置为全 0 之后,我以某种方式传递了“struct addrinfo”提示。这导致端点以某种方式无效。在更改结构中的值之前放置 memset 后,这个问题就消失了。仍然不确定发送是如何通过的,但这就是问题所在。

于 2013-05-28T06:11:43.840 回答