1

Тема: Питання обміну по sokets c#

Мої вітання.
Я намагаюсь налагодити обмін через сокети. Створив сервера і кліента.
Сервер

// ...
var client = e.TcpClient;
NetworkStream networkStream = client.GetStream();
while(true) {
    byte[] query = new byte[32];
    networkStream.Read(query, 0, query.Length);

    if(query[1] == 0x0a) {
        byte[] entpass = new byte[] { 0x00 };
        byte[] sizeBuffer = new byte[4];
        networkStream.Read(sizeBuffer, 0, sizeBuffer.Length);
        int size = BitConverter.ToInt32(sizeBuffer, 0);
        byte[] data = new byte[size];
        int bytes = networkStream.Read(data, 0, size);
        // ...
        // Далі йде читання даних з БД
    }
    // ...
}

Клієн робить заклик з необхідним флагом, наприклад "0x0a" і отримує данні.

В мене трапилось проблемка і відразу питання: після з'єднання з сервером і отримання порції данних "ліг" клієнт - я поставив MessageBox на виняток.
В моєму розумінні сервер мав би зупинитися на інструкціі "networkStream.Read(query, 0, query.Length);"
А він "молотить" далі ...
Поясніть, будь ласка, з чим повязана така ситуація.

2 Востаннє редагувалося Droid 77 (11.01.2024 02:31:12)

Re: Питання обміну по sokets c#

Відсутній метод CanRead.
Майкрософт ось тут: лінка
Все розжовує ..

Метод CanRead перевіряє доступність для читання та запису даних.

3

Re: Питання обміну по sokets c#

Сподіваюсь за некрофілію мене не поб'ють, але гадаю на таке натикаються всі новачки.

agapa написав:

А він "молотить" далі ....

1. Треба намагатись уникати нескінчених циклів. while(true) потенційно небезпечна конструкція, бо немає розуміння коли воно повинно зупинитись, тому і молотить.
2. Метод Read повертає кількість реально зчитаних байт, і якщо там 0 -- це означає закриття потоку на зчитування (далі намагатись зчитати немає сенсу, виходимо з циклу)