Я пытаюсь создать соединение с сервером / портом, которые мне предоставляются. После установления соединения я могу отправить ему ping-пакеты (по крайней мере, я думаю, что могу, так как send (), кажется, возвращает правильный количество байт), но когда я пытаюсь выполнить recv () сразу после вызова, произойдет сбой
"Error on Receiving .. Connection Refused"
Любые идеи о том, почему отправка не будет давать ошибку, но 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) ;
}
Я могу вставить свой код, который устанавливает фактическое соединение, но я бы подумал, что если бы в нем была ошибка, то отправка никогда не прошла бы с самого начала?
Спасибо за чтение — любая помощь приветствуется!
Разобрался — это было что-то чрезвычайно глупое с моей стороны. Проблема была с моим утверждением getaddrinfo (). Я как-то передавал подсказки «struct addrinfo» после установки его в 0. Это привело к тому, что конечная точка была как-то недействительной. После размещения memset до изменения значений в структуре эта проблема исчезла. Все еще не уверен, как проходили посылки, но это была проблема.
Других решений пока нет …