Я имею дело с проблемой, что после успешной отправки данных я получил первый ответ от клиента, а второй — после того, как он добавил свои данные и не отправил.
Есть ли у вас идеи, почему это произошло?
Вот мой код:
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);
}
Всегда всегда всегда (я не могу сказать, что достаточно часто) проверять возвращаемое значение recv
, recv
буду читать вплоть до сумма, которую вы запросили. Если вы уверены, что запрошенная вами сумма уже в пути, вы должны начать recv
буферизация входящих данных, пока вы не получите то, что ожидаете получить.
Этот тип ошибки обычно скрывается, пока вы тестируете на локальном компьютере с помощью очень быстрого интерфейса localhost, а затем появляются, как только вы запускаете клиент и сервер на разных хостах.
Когда вы переходите от своего тестового кода к реальному коду, вы также должны иметь дело с ответами нулевой длины (клиент закрыл сокет) и кодами ошибок (<0 ответ).
Наконец, пожалуйста, оставьте свой код клиента. Там также могут быть ошибки.
TCP является потоковым протоколом. Вполне возможно, что вы прочитали все сообщения в первом recv. Проверьте размер полученных данных и посмотрите, соответствует ли он ожидаемому результату.