Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Recv()上的连接被拒绝,而send似乎工作正常_C++_Sockets_Send_Recv - Fatal编程技术网

C++ Recv()上的连接被拒绝,而send似乎工作正常

C++ Recv()上的连接被拒绝,而send似乎工作正常,c++,sockets,send,recv,C++,Sockets,Send,Recv,我正在尝试创建一个到提供给我的服务器/端口的连接-在建立连接时,我能够向它发送ping数据包(至少我认为我能够,因为send()似乎返回了正确的字节数),但是当我尝试在之后立即recv()时,调用失败 "Error on Receiving .. Connection Refused" 关于为什么send不会给出错误,而recv会给出错误,你有什么想法吗?下面是导致我失败的代码部分-它在自己的线程上运行。TCP连接是在另一个线程上建立的,该套接字描述符被传递给这个线程(下面称为m_sock

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

"Error on Receiving .. Connection Refused"  
关于为什么send不会给出错误,而recv会给出错误,你有什么想法吗?下面是导致我失败的代码部分-它在自己的线程上运行。TCP连接是在另一个线程上建立的,该套接字描述符被传递给这个线程(下面称为m_sockfd)

void ConnectionManager::operator()()
{
int rc=0,numBytes=0;
字符回复[256];
//发一个ping
字符包[23];
准备电子包(PingPacket);
numBytes=发送(m_sockfd,PingPacket,23,0);
if(numBytes==-1)
{
fprintf(stderr,“发送Ping时出错..\n”);
返回;
}
如果(单位<23)
{
fprintf(stderr,“未发送整个Ping请求..%d\n”,numBytes);
}
numBytes=recv(m_sockfd,reply,256,0);
if(numBytes==-1)
{
fprintf(stderr,“接收时出错..%s\n”,strerror(errno));
返回;
}
解析包(应答,rc);
}
我可以粘贴进行实际连接的代码,但我想如果它有错误,那么发送就永远不会通过


感谢您的阅读-感谢您的帮助

我明白了——从我这方面来说,这是一件极其愚蠢的事情。问题在于我的getaddrinfo()语句。在mem将“struct addrinfo”设置为所有0之后,我不知怎么传入了它。这导致端点以某种方式无效。在更改结构中的值之前放置memset之后,这个问题就消失了。仍然不确定这些邮件是如何发送的,但这就是问题所在

我明白了——从我这方面来说,这是一件极其愚蠢的事情。问题在于我的getaddrinfo()语句。在mem将“struct addrinfo”设置为所有0之后,我不知怎么传入了它。这导致端点以某种方式无效。在更改结构中的值之前放置memset之后,这个问题就消失了。仍然不确定这些邮件是如何发送的,但这就是问题所在

使用WSAGetLastError()获取Winsock错误代码,然后使用查看它的含义。我在大学的服务器上运行了我的代码,它运行得完美无缺—似乎我只是在家里遇到了这个问题。我使用端口转发将所有流量定向到特定端口,并通过确保传入连接能够通过,但不确定recv()为何发出61/连接被拒绝来验证。使用WSAGetLastError()获取Winsock错误代码,然后使用查看其含义。我在大学服务器上运行了代码,而且它工作完美无瑕——似乎我只是在家里讨论这个问题。我使用端口转发将所有流量定向到特定端口,并通过确保传入连接能够通过来验证这一点,但不确定recv()为何发出61/连接被拒绝。
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) ; 
}