Функция Tcp Socket recv не работает. Переполнение стека

Я имею дело с проблемой, что после успешной отправки данных я получил первый ответ от клиента, а второй — после того, как он добавил свои данные и не отправил.
Есть ли у вас идеи, почему это произошло?
Вот мой код:

    sock->listenAndAccept();
string url="HTTP/1.1 302 Found \r\nContent-Type: text/html; charset=utf8 \r\nContent-        Length:279\r\n\r\n<!DOCTYPE html><html><head><title>Creating an HTML Element</title></head><body><form name=\"input\" action=\"login.html\" method=\"get\">user name: <input type=\"text\" name=\"user\"><br>password: <input type=\"text\" name=\"password\"><input type=\"submit\" value=\"Submit\"></form></body></html>";
sock->send(url.data(),url.length());
char buffer[1000];
sock->recv(buffer, 1000);
cout<<buffer<<endl;
sock->recv(buffer, 1000);
cout<<buffer<<endl;

прослушать и принять функцию:

TCPSocket* TCPSocket::listenAndAccept(){
int rc = listen(socket_fd, 1);
if (rc<0){
return NULL;
}
size_t len = sizeof(peerAddr);
bzero((char *) &peerAddr, sizeof(peerAddr));

int connect_sock = accept(socket_fd, (struct sockaddr *)&peerAddr,(unsigned int *)&len);
return new TCPSocket(connect_sock,serverAddr,peerAddr);
}

функция recv:

int TCPSocket::recv(char* buffer, int length){
return read(socket_fd,buffer,length);
}

0

Решение

Всегда всегда всегда (я не могу сказать, что достаточно часто) проверять возвращаемое значение recv, recv буду читать вплоть до сумма, которую вы запросили. Если вы уверены, что запрошенная вами сумма уже в пути, вы должны начать recv буферизация входящих данных, пока вы не получите то, что ожидаете получить.

Этот тип ошибки обычно скрывается, пока вы тестируете на локальном компьютере с помощью очень быстрого интерфейса localhost, а затем появляются, как только вы запускаете клиент и сервер на разных хостах.

Когда вы переходите от своего тестового кода к реальному коду, вы также должны иметь дело с ответами нулевой длины (клиент закрыл сокет) и кодами ошибок (<0 ответ).

Наконец, пожалуйста, оставьте свой код клиента. Там также могут быть ошибки.

0

Другие решения

TCP является потоковым протоколом. Вполне возможно, что вы прочитали все сообщения в первом recv. Проверьте размер полученных данных и посмотрите, соответствует ли он ожидаемому результату.

1

По вопросам рекламы [email protected]