Отправка Socket Client с использованием соединения, принятого сервером

Правильный ли это способ, которым клиент отправляет данные, используя то же соединение, которое принимает сервер?

Ситуация такая: у меня на компьютере запущен сервер 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.

1

Решение

Самая большая проблема, которую я вижу, в том, что ты никогда не покинешь свой while(1) цикл, даже когда клиент отключается. Чтение вернется сразу навсегда с прочтением 0 байт (проверьте код возврата <= 0), пытаюсь сигнализировать, что розетка отключена. Ваш код войдет в тесный бесконечный цикл и израсходует все ресурсы процессора, которые он может получить однопоточными руками.

Вы должны убедиться, что вы ВСЕГДА проверяете свои коды возврата сокета и ввода-вывода и правильно обрабатываете ошибки. Обработка ошибок для сокетов обычно примерно в 3 раза превышает фактический код сокета.

Если, конечно, .......... вещи это важные биты. Всегда трудно сказать, когда люди скрывают код, соответствующий заданному вопросу.

0

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

Мне кажется правильным, но после read ты должен NUL ('\0') завершите ваш буфер, если вы обрабатываете строки:

buf[bytes_read] = '\0';
0