Правильный ли это способ, которым клиент отправляет данные, используя то же соединение, которое принимает сервер?
Ситуация такая: у меня на компьютере запущен сервер blue tooth, а с другой стороны у меня андроид телефон с клиентом и сервером. Со стороны андроида клиент запускает соединение. Я использую пример чата голубых зубов из образцов Android.
И сервер-клиент на андроиде похож
BluetoothSocket socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
И на стороне ПК я использую Bluez библиотеки для реализации сервера и клиента.
Код включает в себя приемный поток blue tooth и основной поток, всякий раз, когда сервер принимает соединение с телефона Android, я просто назначаю значение сокета глобальной переменной, и всякий раз, когда клиенту необходимо отправить данные, которые он отправляет, используя тот же сокет,
Сервер: —
int GLOBAL_CLIENT;
void* recive_bluetooth_trd(void*)
{
...............................
..............................
client = accept(s, (struct sockaddr *)&rem_addr, &opt);
GLOBAL_CLIENT=client;
while(1){
bytes_read = read(client, buf, sizeof(buf));
....................
...................
}
Клиент: —
void clinet(char *msg, int length){
........................
int bytes_write=write(GLOBAL_CLIENT,message, length);
..........................
}
Мой вопрос, это правильный метод? Проблема в том, что иногда клиент успешно отправляет данные с ПК, но не получает на стороне Android.
Самая большая проблема, которую я вижу, в том, что ты никогда не покинешь свой while(1)
цикл, даже когда клиент отключается. Чтение вернется сразу навсегда с прочтением 0 байт (проверьте код возврата <= 0), пытаюсь сигнализировать, что розетка отключена. Ваш код войдет в тесный бесконечный цикл и израсходует все ресурсы процессора, которые он может получить однопоточными руками.
Вы должны убедиться, что вы ВСЕГДА проверяете свои коды возврата сокета и ввода-вывода и правильно обрабатываете ошибки. Обработка ошибок для сокетов обычно примерно в 3 раза превышает фактический код сокета.
Если, конечно, ..........
вещи это важные биты. Всегда трудно сказать, когда люди скрывают код, соответствующий заданному вопросу.
Мне кажется правильным, но после read
ты должен NUL
('\0'
) завершите ваш буфер, если вы обрабатываете строки:
buf[bytes_read] = '\0';