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() ステートメントにありました。memset をすべて 0 に設定した後、どういうわけか「struct addrinfo」ヒントを渡していました。これにより、エンドポイントが何らかの形で無効になりました。構造体の値を変更する前に memset を配置すると、この問題はなくなりました。送信がどのように行われたかはまだわかりませんが、それが問題でした。

于 2013-05-28T06:11:43.840 に答える