Я пытаюсь проверить, отправил ли клиент некоторые новые данные. На самом деле это говорит мне, что я всегда есть новые данные:FD_ISSET всегда верен, даже если новых данных нет?
bool ClientHandle::hasData()
{
fd_set temp;
FD_ZERO(&temp);
FD_SET(m_sock, &temp);
//setup the timeout to 1000ms
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1000;
//temp.fd_count possible?
if (select(m_sock+1, &temp, nullptr, nullptr, &tv) == -1)
{
return false;
}
if (FD_ISSET(m_sock, &temp))
return true;
return false;
}
Я соединяющий с клиентом Java и отправить сообщение «соединение», которое я прочитал внутри CTOR:
ClientHandle::ClientHandle(SOCKET s) : m_sock(s)
{
while (!hasData())
{
}
char buffer[5];
recv(m_sock, buffer, 4, NULL);
auto i = atoi(buffer);
LOG_INFO << "Byte to receive: " << i;
auto dataBuffer = new char[i + 1]{'\0'};
recv(m_sock, dataBuffer, i, NULL);
LOG_INFO << dataBuffer;
//clean up
delete[] dataBuffer;
}
Это кажется работа право. После этого я продолжаю проверять, есть ли новые данные, которые всегда верны, даже если java-клиент не отправляет никаких новых данных.
Вот клиент java. Не судите меня, это просто проверка связей. Он не останется таким, чтобы отправить информацию о размере как char [].
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket soc = null;
soc = new Socket("localhost", 6060);
PrintWriter out = new PrintWriter(soc.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(
soc.getInputStream()));
if (soc != null)
System.out.println("Connected");
out.write("10\0");
out.flush();
out.write("newCon\0");
out.flush();
out.close();
in.close();
soc.close();
}
Так что же случилось с методом hasData FD_ISSET?
, поэтому данные имеют прекрасный результат, но, как я вижу из других ответов, он вернется в другие условия. (а не только если он содержит новые данные, что я думал), поэтому метод hasdata не подходит. Поэтому мне нужно как-то добавить это. – BennX
@BennX 'hasData()' почти правильно: вы не должны использовать 'FD_SET' в отключенном сокете. 'recv()' возвращает положительное число, если оно получает данные, '0', если клиент отключается и' -1', если произошла ошибка. Я обновил свой ответ, чтобы добавить больше объяснений. – nouney
Итак, чтобы проверить, есть ли у меня данные, я просто recv и обрабатываю его, если есть новый? Я решил, что могу проверить его с помощью select, прежде чем попытаться получить данные. – BennX